我有以下语法,我想理解为什么输入“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");
}
}
答案 0 :(得分: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' ;
取决于您想要做的更多。
所以一般的想法是先对所有内容进行标记,然后在解析器规则中使用标记。上面的语法结合了词法和解析器规则 - 也许这就是令你困惑的事情。