繁体   English   中英

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

[英]antlr literal string matching: what am I doing wrong?

我已经使用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构建树可在此处快速查看

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

 $ mvn clean test

使用antlr-4.5.2-1。

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

此外,最好扩展您的否定类~('\\n'|'\\r')以包含反斜杠和引号,并且您可能希望包含反斜杠以便能够进行转义:

clause
  : StringLiteral EOF
  ;

StringLiteral :   '\'' ( Escape | ~('\'' | '\\' | '\n' | '\r') ) + '\'';

fragment Escape : '\\' ( '\'' | '\\' );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM