在解析时,我需要添加什么来使用monadUserState和alex?

时间:2015-01-25 20:37:09

标签: parsing haskell alex

我正在尝试编写一个能够理解允许嵌入式注释的语言的程序。如:

/* Here's a comment
  /* This comment is further embedded */ second comment is closed
Must close first comment */

这应该被认为是评论(并且因此不会在第一个* /它看到它停止,除非它之前只看到1个评论开放)。

这在C中修复是一个简单的问题,我可以简单地让一个计数器在看到注释打开时递增,在看到注释关闭时递减。如果计数器为0,我们会在"代码部分"。

然而,如果没有Haskell的州,那就更具挑战性。

我已经读过monadUserState,它应该允许跟踪这种确切类型的解析的状态。但是,除了tutorial page on alex.

之外,我在其上找不到很多阅读材料

当我尝试编译它时会出现错误

templates\wrappers.hs:213:16: Not in scope: `alexEOF`

应该注意的是,我直接改变了" basic"包装到" monadUserState"不改变我的代码(我不知道要添加什么才能使用它)。它说这必须在用户代码中初始化:

data AlexState = AlexState {
        alex_pos :: !AlexPosn,  -- position at current input location
        alex_inp :: String,     -- the current input
        alex_chr :: !Char,      -- the character before the input
        alex_bytes :: [Byte],   -- rest of the bytes for the current char
        alex_scd :: !Int,       -- the current startcode
        alex_ust :: AlexUserState -- AlexUserState will be defined in the     user program
    }

我是一个lexxing菜鸟,我完全不确定我应该在这里添加什么来使它至少编译...然后我可以担心事情的逻辑。< / p>

1 个答案:

答案 0 :(得分:2)

更新:此处提供的工作示例:http://lpaste.net/119212

文件&#34; tiger.x&#34; alex github repo中的(link)包含如何使用monadUserState包装器跟踪嵌入注释的示例。

嗯,不幸的是,这个例子并没有编译,但那里的想法应该有效。

基本上,这些行执行嵌入式注释处理:

<0>             "/*"         { enterNewComment `andBegin` state_comment }
<state_comment> "/*"         { embedComment }
<state_comment> "*/"         { unembedComment }
<state_comment> .            ;
<state_comment> \n           { skip }

对于alexEOF,我们的想法是为您的令牌数据类型添加EOF令牌:

data Tokens = ... | EOF

并将alexEOF定义为:

alexEOF = return EOF

请参阅alex repo中的文件tests / tokens_monadUserState_bytestring.x以获取此示例。