我正在尝试为Antlr3创建一个lexer规则,它将匹配三引号字符串。例如:
"""this is some text"""
我正是这样做的:
TEXT:
'"""' ('\\"' | ~'"')+ '"""'
{
this.setText(
this.getText()
.substring(3, this.getText().length() - 3)
.replace("\\\"", "\"")
);
}
;
效果很好,但每个引号都必须在输入文本中进行转义,如下所示:
"""this is the same text, but with \"escaped quotes\" inside"""
我正试图摆脱这种强制性的报价转义,并解析三引号之间的任何东西(!),如下所示:
"""sample text again, with "quotes" inside"""
我正在尝试将规则更改为:
TEXT:
'"""' (~'"""')+ '"""'
Antlr3 3.5抱怨:
error(100): Spec.g:153:13: syntax error: buildnfa: NoViableAltException(58@[])
error(100): Spec.g:0:1: syntax error: buildnfa: MismatchedTreeNodeException(3!=29)
error(100): Spec.g:0:: syntax error: buildnfa: NoViableAltException(3@[])
error(100): Spec.g:0:1: syntax error: buildnfa: MismatchedTreeNodeException(29!=28)
error(10): internal error: Spec.g : java.lang.NullPointerException
org.antlr.tool.NFAFactory.build_Aplus(NFAFactory.java:516)
...
有什么问题?什么是可能的解决方法?
答案 0 :(得分:1)
最好的方法可能是谓词。
TEXT
: '"""'
( ~'"'
| {input.LA(2) != '"' || input.LA(3) != '"'}? '"'
)*
'"""'
;
这可以在ANTLR 4中使用,只要您在谓词中将input
更改为_input
。
答案 1 :(得分:1)
由于默认情况下.*
和.+
ungreedy ,所以尝试过:
TEXT
: '"""' .* '"""'
{
...
}
;