3

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

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

因此,单行以标识符开头,后跟冒号,然后是行尾。

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

4

1 回答 1

2

最简单的解决方案是通过简单地在输入末尾附加一个来确保输入始终以\n结尾。

或者,您可以通过使用谓词而不是$.

^@ident\:/{ eolOrEof }   { ... }

谓词可以检查令牌周围的输入流并决定它是否应该匹配。在这种情况下,我们只需检查令牌之后的流以检查\nEOF。

确切的定义将取决于您使用的包装器(类型的定义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 回答