如何编写词法分析器规则以匹配不以转义引用结尾的字符串文字?
这是我的语法:
lexer grammar StringLexer;
// from The Definitive ANTLR 4 Reference
STRING: '"' (ESC|.)*? '"';
fragment ESC : '\\"' | '\\\\' ;
Run Code Online (Sandbox Code Playgroud)
这是我的java块:
String s = "\"\\\""; // looks like "\"
StringLexer lexer = new StringLexer(new ANTLRInputStream(s));
Token t = lexer.nextToken();
if (t.getType() == StringLexer.STRING) {
System.out.println("Saw a String");
}
else {
System.out.println("Nope");
}
Run Code Online (Sandbox Code Playgroud)
这输出Saw a String.应该"\"真的匹配STRING吗?
编辑: 280Z28和Bart的解决方案都是很好的解决方案,不幸的是我只能接受一个.
对于正确形成的输入,词法分析器将匹配您期望的文本.但是,使用非贪婪的运算符不会阻止它与以下形式匹配:
'"' .*? '"'
Run Code Online (Sandbox Code Playgroud)
为了尽可能以最"理智"的方式确保字符串是令牌,我建议使用以下规则.
StringLiteral
: UnterminatedStringLiteral '"'
;
UnterminatedStringLiteral
: '"' (~["\\\r\n] | '\\' (. | EOF))*
;
Run Code Online (Sandbox Code Playgroud)
如果您的语言允许字符串文字跨越多行,则可能需要修改UnterminatedStringLiteral以允许匹配行尾字符.
如果不包含UnterminatedStringLiteral规则,词法分析器将通过简单地忽略字符串的开头"字符并继续标记字符串的内容来处理未终止的字符串.
是的,"\"符合STRING规则:
STRING: '"' (ESC|.)*? '"';
^ ^ ^
| | |
// matches: " \ "
Run Code Online (Sandbox Code Playgroud)
如果您不想.匹配反斜杠(和引号),请执行以下操作:
STRING: '"' ( ESC | ~[\\"] )* '"';
Run Code Online (Sandbox Code Playgroud)
如果您的字符串不能分布在多行上,请执行以下操作:
STRING: '"' ( ESC | ~[\\"\r\n] )* '"';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4853 次 |
| 最近记录: |