1

は、私は、入力として使用ANTLRANTRLシンプルな文法や識別子

grammar ALang; 

@members { 

public static void main(String[] args) throws Exception { 
    ALangLexer lex = new ALangLexer(new ANTLRFileStream("antlr/ALang.al")); 
    CommonTokenStream tokens = new CommonTokenStream(lex); 
    ALangParser parser = new ALangParser(tokens); 
    parser.prog(); 
} 

} 

prog : 
    ID | PRINT 
    ; 

PRINT : 'print'; 
ID : ('a'..'z' | 'A'..'Z')+; 
WS : (' ' | '\t' | '\n' | '\r')+ { skip(); }; 

のために、この単純な文法を書いた:

print 

見つけた唯一のトークンが型IDのトークンです。 PRINTトークン定義をID定義の直前に置くだけでは不十分ですか?

+1

は、PRINT非終端記号定義上のスペースがありませんか? – Yola

答えて

1

ALang.g:21:1: The following token definitions can never be matched because prior tokens match the same input: PRINT

はい、これで十分です。あなたはIDPRINTを定義する場合、ANTLRはエラーを生成します:

ALang.g:21:1: The following token definitions can never be matched because prior tokens match the same input: PRINT 

I'm so sorry, i didn't want to use this production: PRINT : 'print '; but the production without the trailing space: PRINT : 'print'; The problem is that 'print' is derived from ID and not from PRINT

いいえ、それはケースにすることはできません。

grammar ALang; 

@members { 
    public static void main(String[] args) throws Exception { 
    ALangLexer lex = new ALangLexer(new ANTLRStringStream("sprint print prints foo")); 
    CommonTokenStream tokens = new CommonTokenStream(lex); 
    ALangParser parser = new ALangParser(tokens); 
    parser.prog(); 
    } 
} 

prog 
: (ID {System.out.printf("ID :: '\%s'\n", $ID.text);} 
    | PRINT {System.out.printf("PRINT :: '\%s'\n", $PRINT.text);} 
    )* 
    EOF 
; 

PRINT : 'print'; 
ID : ('a'..'z' | 'A'..'Z')+; 
WS : (' ' | '\t' | '\n' | '\r')+ {skip();}; 

が印刷されます:

ID :: 'sprint' 
PRINT :: 'print' 
ID :: 'prints' 
ID :: 'foo' 

ご覧のとおり、PRINTルール試合"print"を行います。

+0

大変申し訳ございませんが、私はこのプロダクションを使用したくありませんでした:PRINT: 'print';後に続くスペースのない生産:PRINT: 'print'; 問題は、 'print'はIDから派生したものであり、PRINTではないことです。 – Antonio

+0

バートありがとうございました。あなたのg-fileをコピー&ペーストしてください。パーサーを生成します。パーサーを実行します。 ID :: 'スプリント' ID :: '印刷' ID :: 'プリント' ID :: 'foo' でANTLRの バージョン:3.4これは私の出力です。あなたはそれについてどう思いますか? – Antonio

+0

もう一度、申し訳ありませんバート。それは今働く。おそらく、Eclipseとの不整合があるかもしれません。ありがとう。 – Antonio