Alex lex.x 编译:不在范围内 'begin'

Alex lex.x compilation : Not in scope 'begin'

我在 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'

起始代码仅在使用任何 monad-... 包装器时可用。

如果您阅读 monad 包装器的文档 -- Section 5.3.3 - The "monad" wrapper -- 您会发现它是第一个跟踪起始代码的包装器。

您还可以通过查找 alex 包装文件来验证这一点——查找包含文件 AlexWrapper-basicAlexWrapper-posn 等的目录。在 OS X 上安装 Haskell 平台它们位于 /Library/Haskell/ghc-7.10.2-x86_64/share/alex-3.1.4 这样的目录中。函数 beginandBegin 仅出现在与 monad 相关的包装器中。