我在Lex.x中有以下语句来解析块注释。
<0> "//".* { tokWValue LTokComment }
<0> "/*" { begin blockcomment }
<blockcomment> "*/" { begin 0 }
<blockcomment> . { tokWValue LTokComment }
但是如果我使用Alex生成Lex.hs,它不会添加'begin'函数。 这导致以下编译错误。
src/Lex.x:367:18: Not in scope: ‘begin’
src/Lex.x:368:18: Not in scope: ‘begin’
知道可能出现什么问题吗?
我正在使用包装'posn'
答案 0 :(得分:4)
启动代码仅在使用任何else-clause
包装器时可用。
如果您阅读monad包装器的文档 - Section 5.3.3 - The "monad" wrapper - 您会看到它是第一个跟踪起始代码的包装器。
您还可以通过查找alex包装器文件来验证这一点 - 查找包含文件monad-...
,AlexWrapper-basic
等的目录。在OS X上安装Haskell平台时,它们位于像AlexWrapper-posn
这样的目录。函数/Library/Haskell/ghc-7.10.2-x86_64/share/alex-3.1.4
和begin
仅出现在与monad相关的包装器中。