1

トリプルクォートで囲まれた文字列に一致する 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)
...

なにが問題ですか?可能な回避策は何ですか?

4

2 に答える 2

1

.*.+はデフォルトで貪欲でないため、単純に次のことを試してみました。

TEXT
 : '"""' .* '"""'
   { 
     ... 
   }
 ;

?

于 2013-07-02T20:38:37.130 に答える