Sto (ora) cercando di usare ANTLR4 e C# per progettare un linguaggio, e finora ho continuato a giocherellare con esso. Nel processo, ho deciso di provare a creare un semplice valutatore di espressioni matematiche. Nel processo, ho creato il seguente grammatica ANTLR per esso:Quali sono questi strani errori che si verificano quando tento di generare C# con ANTLR4?
grammar Calculator;
@parser::members
{
protected const int EOF = Eof;
}
@lexer::members
{
protected const int EOF = EOF;
protected const int HIDDEN = Hidden;
}
program : expr+ ;
expr : expr op=('*' | '/') expr
| expr op=('+' | '-') expr
| INT
| '(' expression ')'
;
INT : [0-9]+ ;
MUL : '*' ;
DIV : '/' ;
ADD : '+' ;
SUB : '-' ;
WS : (' ' | '\r' | '\n') -> channel(HIDDEN) ;
Quando provo a generare il codice C# da esso con questo comando:
java -jar C:\...\antlr-4.2-complete.jar -DLanguage=CSharp .\...\Grammar.g4
ricevo questi errori dispari:
error(50): C:\Users\Ethan\Documents\Visual Studio 2015\Projects\CypressLang\CypressLang\Source\.\Grammar\CypressGrammar.g4:1:0: syntax error: 'ï' came as a complete surprise to me error(50): C:\Users\Ethan\Documents\Visual Studio 2015\Projects\CypressLang\CypressLang\Source\.\Grammar\CypressGrammar.g4:1:1: syntax error: '»' came as a complete surprise to me error(50): C:\Users\Ethan\Documents\Visual Studio 2015\Projects\CypressLang\CypressLang\Source\.\Grammar\CypressGrammar.g4:1:2: syntax error: '¿' came as a complete surprise to me error(50): C:\Users\Ethan\Documents\Visual Studio 2015\Projects\CypressLang\CypressLang\Source\.\Grammar\CypressGrammar.g4:1:3: syntax error: mismatched input 'grammar' expecting SEMI
Quali potrebbero essere la causa di questi errori e come posso risolverli? La mia ipotesi migliore al momento è che Visual Studio stia inserendo caratteri dispari all'inizio del file e non riesco a rimuoverli.
Questi caratteri "dispari" sono i BOM cosiddetti ([byte order mark] (https://en.wikipedia.org/wiki/Byte_order_mark)). Il file è stato memorizzato in UTF-8 probabilmente dove il BOM è composto da 3 byte (quelli per cui è stato visualizzato l'avviso). È possibile memorizzare un file Unicode con o senza BOM e non è necessario tornare alla codifica ASCII, solo per eliminare il BOM. –