2015-10-31 38 views
5

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.

cevap

4

Bugün güzel bir gün değil.

Visual Studio, benimle uğraşmaya ve dosya biçimlerimi tüm dosyalarım için UTF-8 olarak değiştirmeye karar verdi. Tek yapmam gereken File > Advanced Save Settings'a gitmek ve kodlamayı US-ASCII olarak değiştirmekti. Bu başlangıçta eklenen garip karakterleri kaldırdı ve benim sorunların çoğunu çözdü.

+2

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. –