3

私はこのAlexようなルールを持っています

^@ident\:$   {TLabel (init s)}

つまり、識別子で始まり、その後にコロンが続き、その後に行末が続く 1 行です。

行がファイルの最後であり、最後に a がない場合を除き、これは正常に機能します\n。その場合、$が一致せず、スキャンが失敗します。\n行末 ( ) またはファイルの末尾を一致させるにはどうすればよいですか?

4

1 に答える 1

2

最も簡単な解決策は、入力の末尾に 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
于 2013-04-20T01:00:26.590 に答える