Antlr如何创建令牌

时间:2012-06-13 08:12:49

标签: parsing antlr

我有以下语法,我想理解为什么输入“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");
    }
}

1 个答案:

答案 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' ;

取决于您想要做的更多。

所以一般的想法是先对所有内容进行标记,然后在解析器规则中使用标记。上面的语法结合了词法和解析器规则 - 也许这就是令你困惑的事情。