[英]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.