2

我在 Lex.x 中有以下语句来解析块注释。

<0>  "//".*                 { tokWValue LTokComment   }            
<0>  "/*"                   { begin blockcomment      }            
<blockcomment> "*/"         { begin 0                 }            
<blockcomment> .            { tokWValue LTokComment   }  

但是如果我使用 Alex 生成 Lex.hs,它不会添加“开始”功能。这会导致以下编译错误。

src/Lex.x:367:18: Not in scope: ‘begin’
src/Lex.x:368:18: Not in scope: ‘begin’

知道可能出了什么问题吗?

我正在使用包装器'posn'

4

1 回答 1

4

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

如果你阅读了 monad 包装器的文档——第 5.3.3 节——“monad”包装器——你会看到它是第一个跟踪起始代码的包装器。

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

于 2015-11-03T06:35:51.633 回答