私はクエリを解析するための文法を実装しようとしています。単一クエリはitems
で構成され、各項目はname
またはname-ref
のいずれかになります。Antlr3文法に引用符で囲まれた文字列を追加する
name
はmystring
(文字のみ、スペースなし)または"my long string"
のいずれかである(文字とスペース、常に引用さ)。 name-ref
はname
と非常によく似ていますが、唯一の違いはref:
(ref:mystring
,ref:"my long string"
)で始まることです。クエリには少なくとも1項目(name
またはname-ref
)を含める必要があります。ここで
は、私が持っているものです。
NAME: ('a'..'z')+;
REF_TAG: 'ref:';
SP: ' '+;
name: NAME;
name_ref: REF_TAG name;
item: name | name_ref;
query: item (SP item)*;
この文法は、私は基本的に取得する必要があり、唯一の機能は、それが長い引用符で囲まれた文字列(それは持っていない名前のために正常に動作をサポートしていないということが何であるかを示していますスペース)。
SHORT_NAME: ('a'..'z')+;
LONG_NAME: SHORT_NAME (SP SHORT_NAME)*;
REF_TAG: 'ref:';
SP: ' '+;
Q: '"';
short_name: SHORT_NAME;
long_name: LONG_NAME;
name_ref: REF_TAG (short_name | (Q long_name Q));
item: (short_name | (Q long_name Q)) | name_ref;
query: item (SP item)*;
しかし、これは機能しません。何が問題なの?おそらく、それは重要です:my first query
は、3 item
s(3 name
s)と扱われ、"my first query"
は1 item
(1 long_name
)となるはずです。ここで
'' long_name'ノードの下で '' 'を取り除く方法はありますか?私は構文を欲しいですが、解析の結果を扱うときには必要ありません。インラインではないJavaソリューションには本当に感謝します – agibalov
@あなたはあなたの答えを受け入れるのですか?これはあなたにもう質問はありませんか? –
私はちょうどあなたがあなたの答えを更新したのを見る前に応答しました。まあ、はい、基本的に私の質問はここにあります - Java文字列プロシージャなしで2番目の方法を実装する方法はありますか? – agibalov