如何为Alex lexer指定标签宽度?

时间:2014-07-12 15:31:52

标签: haskell alex

Alex文档(第5章)says:

  

您可能希望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)

1 个答案:

答案 0 :(得分:1)

一个想法是创建自己的包装器,以您希望的方式定义alexMove

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

查找名为" AlexWrapper-monad"," AlexWrapper-monad-bytestring",...的文件驻留在您的系统上。

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