【问题标题】:What do I need to add to use monadUserState with alex when parsing?解析时我需要添加什么才能将 monadUserState 与 alex 一起使用?
【发布时间】:2015-01-25 20:37:09
【问题描述】:

我正在尝试编写一个程序来理解允许嵌入 cmets 的语言。如:

/* 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`

需要注意的是,我直接从“基本”包装器更改为“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 菜鸟,我完全不确定我应该在这里添加什么以使其至少可以编译......然后我可以担心事情的逻辑。

【问题讨论】:

    标签: parsing haskell alex


    【解决方案1】:

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

    alex github 存储库中的文件“tiger.x”(link) 包含如何使用 monadUserState 包装器跟踪嵌入式 cmets 的示例。

    不幸的是,该示例无法编译,但其中的想法应该可行。

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

    <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 存储库中的文件 tests/tokens_monadUserState_bytestring.x。

    【讨论】:

    • 我忘了感谢您的回复。感谢您在此回复中投入的时间和精力,它对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多