antlr文字字符串匹配:我做错了什么?

时间:2016-03-28 13:53:41

标签: antlr4 string-literals

我一直在使用antlr 3天。我可以解析表达式,编写听众,解释解析树......这是梦想成真。

但后来我尝试匹配文字字符串'foo%'而我失败了。我可以找到很多声称可以做到这一点的例子。我试过了所有这些。

所以我创建了一个与文字字符串匹配的小项目。我一定是在做些傻事。

grammar Test;

clause
  : stringLiteral EOF
  ;

fragment ESCAPED_QUOTE : '\\\'';
stringLiteral :   '\'' ( ESCAPED_QUOTE | ~('\n'|'\r') ) + '\'';

简单测试:

public class Test {

    @org.junit.Test
    public void test() {
        String input = "'foo%'";
        TestLexer lexer = new TestLexer(new ANTLRInputStream(input));
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TestParser parser = new TestParser(tokens);
        ParseTree clause = parser.clause();
        System.out.println(clause.toStringTree(parser));

        ParseTreeWalker walker = new ParseTreeWalker();
    }
}

结果:

Running com.example.Test
line 1:1 token recognition error at: 'f'
line 1:2 token recognition error at: 'o'
line 1:3 token recognition error at: 'o'
line 1:4 token recognition error at: '%'
line 1:6 no viable alternative at input '<EOF>'
(clause (stringLiteral ' ') <EOF>)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.128 sec - in com.example.Test

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

完整的maven-ized构建树可用于快速查看here

31行代码......其中大部分来自小例子。

 $ mvn clean test

使用antlr-4.5.2-1。

1 个答案:

答案 0 :(得分:2)

to规则只能由其他词法分析器规则使用。因此,您需要使fragment成为词法分析器规则而不是解析器规则。让它以大写字母开头。

此外,最好将您的否定类stringLiteral扩展为包含反斜杠和引号,并且您可能希望包含反斜杠以便能够进行转义:

~('\n'|'\r')