在Alex
我有一个看起来像这样的规则
^@ident\:$ {TLabel (init s)}
所以,一行以标识符开头,后跟冒号,然后是行尾。
除非该行是文件中的最后一行并且最后没有\n
,否则这样可以正常工作。发生这种情况时,$
不匹配,扫描失败。我需要做什么才能匹配行尾(\n
)或文件末尾?
答案 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