2

我借用了这里展示的例子

http://www.haskell.org/alex/doc/html/introduction.html

我正在尝试为数值表达式制作解释器。(只有文字,没有变量)我想让换行符分隔两个不同的表达式。不幸的是,当我这样做时

$ignoredWhite = [\t\f\v\r] -- 忽略空格

$newline = "\n" --换行

Alex (v 2.2) 中止编译。我努力了

$newline = \n --换行

但这只会在读取输入时导致中止从 alex 移动到最终二进制文件(也就是由 ghc 生成的二进制文件)。

我该如何解决这个问题?

4

2 回答 2

3

这个问题真的很老了,不过我会为未来的访客发布我的答案。定义标记后,我告诉 alex 处理所有空格:

tokens :-
  $white {\p s -> checkWhite p $ head s} 

checkWhite看起来像这样:

checkWhite :: AlexPosn -> Char -> Token
checkWhite p '\n' = TNewLine p
checkWhite p _ = TEmpty

如您所见,当遇到换行符时,它会输出一个特殊标记。要从输出中删除TEmpty,您可以使用... filter (\= TEmpty) $ alexScanTokens ....

于 2012-12-27T14:25:42.130 回答
2

只是猜测-您是否尝试将其包含在字符范围中?

$newline = [\n]
于 2010-07-24T15:23:08.620 回答