1

Alex 文档(第 5 章)说:

您可能希望 Alex 跟踪输入文本中的行号和列号,或者您可能希望自己完成(例如,您可能使用与标准 8 列不同的制表符宽度)

但是在 Alex 位置跟踪器中将标签宽度从 8 更改为 4 并不容易。代码隐藏在 Alex 生成的例程中:

-- this function is used by `alexGetByte`, which is used by `alex_scan_tkn`, which is 
-- used by `alexScanUser` and `alexRightContext`,
-- which is used by `alex_accept` etc etc...
alexMove :: AlexPosn -> Char -> AlexPosn
alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+7) `div` 8)*8+1)
alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1)   1
alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)
4

1 回答 1

1

一个想法是创建自己的包装器,它定义alexMove了你想要的方式。

在我的 Mac 上,包装器安装在 /Library/Haskell/ghc-7.6.3/lib/alex-3.0.5/share/

查找名为“AlexWrapper-monad”、“AlexWrapper-monad-bytestring”的文件在您的系统中的位置。

“-t”命令行选项告诉 alex 在哪里查找模板,但它也可能与包装器有关,因为包装器和模板似乎位于同一目录中。

于 2014-07-12T16:15:14.793 回答