私はこの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