1

私は2つの式を持っています:

ident = alpha . (alnum|[._\-])*;
string = (printable1)+;
  # Printable includes almost all Windows-1252 characters with glyphs.
main := ( ident % do_ident | string % do_string )
  # The do_* actions have been defined, and generate tokens.

明らかに、任意の ident は文字列です。Ragel には、これを克服するための優先オペレーターがいます。しかし、どのように優先度を設定しようとしても、一部の ident が両方のアクションを実行するか、一部の有効な文字列が無視されます (有効な ident を接頭辞として持つ有効な文字列、たとえば ab$)。

優先順位を使用せずに、それを回避する1つの方法を見つけました:

main := ( ident % do_ident | (string - ident) % do_string )

しかし、重複する式がいくつかある場合、これは面倒になります。これが唯一の実用的な方法ですか?

これを行う正しい方法についての助けをいただければ幸いです。

4

2 に答える 2

1

あなたの問題は、すべての有効な識別子が有効な文字列でもあるということです。可能であれば、最初に識別子として解釈したいだけです。ident の leave アクションに優先度を埋め込むことで、最初に識別子を受け入れるように強制できます。これは、string のすべての遷移をオーバーライドします。

main := ( ident %(ident_vs_string, 1) % do_ident | string $(ident_vs_string, 0) % do_string )

これにより、有効な式に続く終了遷移により、マシンが文字列を続行または終了することを確認できなくなります。

この組み合わせ式の終了方法に注意してください。終了遷移が明確に定義されるように、識別子/文字列に続く式はいずれも許可されていない文字で開始する必要があります。

于 2014-10-02T23:07:55.297 に答える