我正在尝试编写一个能够理解允许嵌入式注释的语言的程序。如:
/* 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>
答案 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以获取此示例。