Ben (şimdi) bir dili tasarlamak için ANTLR4 ve C# kullanmaya çalışıyorum ve şu ana kadar bununla uğraşıyorum. Süreçte, basit bir matematiksel ifade değerlendirici oluşturmaya ve denemeye karar verdim. Bu süreçte, bunun için aşağıdaki ANTLR dilbilgisi yarattı:ANTLR4 ile C# üretmeye çalıştığımda ortaya çıkan bu garip hatalar nelerdir?
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) ;
Bu komutu kullanarak ondan C# kodu oluşturmak çalıştığınızda:
java -jar C:\...\antlr-4.2-complete.jar -DLanguage=CSharp .\...\Grammar.g4
Bunları tuhaf hatalar alıyorum:
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
Bu hatalara neden olabilir ve bunları nasıl düzeltebilirim? Şu anki en iyi tahminim Visual Studio'nun tekil karakterleri dosyanın başına eklediğidir ve bunları kaldıramıyorum.
Bu "garip" karakterler, socalled BOM'tur ([bayt sırası işareti] (https://en.wikipedia.org/wiki/Byte_order_mark)). Dosya, UTM-8'de depolanmış olabilir, bu durumda, BOM, 3 bayttan oluşur (uyarıyı aldığınız için). Bir Unicode dosyasını ya da BOM ile saklayabilir ve ASMII kodlamasına geri dönmek zorunda kalmazsınız, sadece BOM'den kurtulmak için. –