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' 替换所有 'a' 和 'b'

该规则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 回答