トリプルクォートで囲まれた文字列に一致する Antlr3 のレクサー ルールを作成しようとしています。例えば:
"""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)
...
なにが問題ですか?可能な回避策は何ですか?