0

次の文法がありますが、入力「a」が一致しない理由を理解したいと思います。parser_a を削除すると、入力が受け入れられます。また、レクサー ルール A の 'b' を削除しても機能します
。動作を説明していただければ幸いです。

grammar SmallTest;
options {
  language = Java;
}
@header {
  package test;
}
@lexer::header {
  package test;
}
start 
    : A EOF;
parser_a 
    : 'a' ;
A 
    : 'a' | 'b' ;

これが私のJavaコードです。また、文法をテストするために使用したコードを投稿すると役に立ちますか??

package test;
public class SmallTest {
    public static void main(String[] args) throws RecognitionException {
        CharStream stream = new ANTLRStringStream("a");
        SmallTestLexer lexer = new SmallTestLexer(stream);
        CommonTokenStream tokenStream = new CommonTokenStream(lexer);
        SmallTestParser parser = new SmallTestParser(tokenStream);
        parser.start();
        System.out.println("done");
    }
}
4

1 に答える 1

1

これA : 'a' | 'b'は lex ルールで、すべての 'a' と 'b' をトークン 'A' に置き換えます。

ルールparser_a : 'a' ;は決して機能しません

代わりに書くべきことは

start 
    : parser_a EOF;
parser_a 
    : A ;
A 
    : 'a' | 'b' ;

または単に

start 
    : A EOF;
A 
    : 'a' | 'b' ;

もっとやりたいこと次第。

したがって、一般的な考え方は、最初にすべてをトークン化してから、パーサー ルールでトークンを使用することです。上記の文法は語彙規則とパーサー規則を組み合わせています - おそらくそれがあなたを混乱させているのでしょう。

于 2012-06-13T08:36:29.843 に答える