Saya mencoba membuat aturan lexer untuk Antlr3, yang akan cocok dengan string yang diberi tanda kutip tiga. Misalnya:
"""this is some text"""
Inilah cara saya melakukannya:
TEXT:
'"""' ('\\"' | ~'"')+ '"""'
{
this.setText(
this.getText()
.substring(3, this.getText().length() - 3)
.replace("\\\"", "\"")
);
}
;
Berfungsi dengan baik, tetapi setiap tanda kutip harus di-escape dalam teks masukan, seperti ini:
"""this is the same text, but with \"escaped quotes\" inside"""
Saya mencoba menghilangkan pelepasan tanda kutip wajib ini, dan mengurai apa pun (!) di antara tanda kutip rangkap tiga, seperti ini:
"""sample text again, with "quotes" inside"""
Saya mencoba mengubah aturan menjadi:
TEXT:
'"""' (~'"""')+ '"""'
Dan Antlr3 3.5 mengeluh:
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)
...
Apa yang salah? Apa solusi yang mungkin?