私はこのAlex
ようなルールを持っています
^@ident\:$ {TLabel (init s)}
つまり、識別子で始まり、その後にコロンが続き、その後に行末が続く 1 行です。
行がファイルの最後であり、最後に a がない場合を除き、これは正常に機能します\n
。その場合、$
が一致せず、スキャンが失敗します。\n
行末 ( ) またはファイルの末尾を一致させるにはどうすればよいですか?
私はこのAlex
ようなルールを持っています
^@ident\:$ {TLabel (init s)}
つまり、識別子で始まり、その後にコロンが続き、その後に行末が続く 1 行です。
行がファイルの最後であり、最後に a がない場合を除き、これは正常に機能します\n
。その場合、$
が一致せず、スキャンが失敗します。\n
行末 ( ) またはファイルの末尾を一致させるにはどうすればよいですか?
最も簡単な解決策は、入力の末尾に 1 を追加するだけで、常に入力が終了するようにすること\n
です。
または、 の代わりに述語を使用して、必要な動作を得ることができます$
。
^@ident\:/{ eolOrEof } { ... }
述語は、トークンを囲む入力ストリームを調べて、一致するかどうかを判断できます。この場合、チェックするトークン\n
または EOF の後のストリームを調べるだけです。
正確な定義は、使用しているラッパーによって異なります (型の定義はAlexInput
ラッパーによって異なります) が、ラッパーを使用して作業する必要があるものを次に示し"basic"
ます。
eolOrEof :: user -> AlexInput -> Int -> AlexInput -> Bool
eolOrEof _ _ _ (_, after) =
case after of
[] -> True -- end-of-file
('\n':_) -> True -- end-of-line
_ -> False