1

(@Bart Kiers の最初のコメントに基づいて質問を編集しました - ありがとう!)

私は次の文法を持っています:

SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
START : 'START:';
STRING_LITERAL  : ('"' .* '"')+;
rule    :  START STRING_LITERAL;

'START: "abcd" START: "img src="test.jpg""' (文字列リテラルは文字列リテラル内にある可能性があります) のような言語を解析したいと考えています。
言語 'START: "img src="test.jpg""' の場合、レクサーはそれを次のトークンに変換するため、文字列リテラル内に文字列リテラルがある場合、上記で定義された文法は機能しません: START('START:') STRING_LITERAL("img src=") test.jpg.
私の問題に適した文法を定義する方法はありますか?

4

1 に答える 1

0

ここにはいくつかの問題があります。

  • fragmentパーサー ルール内でルールを使用することはできません。あなたの文法は決してSTARTトークンを作成しません。
  • パーサー ルール内の.char (DOT-char) は任意のトークンに一致しますが、レクサー ルール内では任意の文字に一致します。
  • .*貪欲に一致させた場合(そして、文字列リテラルに一致する適切なレクサー規則を定義した場合)、入力START: "abcd" START: "img src="test.jpg""には 1 つの大きな文字列が含まれます"abcd" START: "img src="test.jpg""(最初と最後の引用符が一致します)。

そのため、同じ引用符を使用して文字列リテラル内に文字列リテラルを埋め込むことはできません。lexer は、引用符が文字列を閉じるためのものなのか、それとも (新しい) 埋め込まれた文字列の始まりなのかを判断できません。文法でそれを変更する必要があります。

于 2012-04-04T06:57:50.923 に答える