Alex right_ctx行尾($)在文件末尾窒息

时间:2013-04-19 22:58:42

标签: haskell lexical-analysis alex

Alex我有一个看起来像这样的规则

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

所以,一行以标识符开头,后跟冒号,然后是行尾。

除非该行是文件中的最后一行并且最后没有\n,否则这样可以正常工作。发生这种情况时,$不匹配,扫描失败。我需要做什么才能匹配行尾(\n)或文件末尾?

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是确保输入始终以\n结尾,只需在输入的末尾添加一个。

或者,您可以使用predicate代替$来获得所需的行为。

^@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