首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以将参数传递给我的fsyacc解析器吗?

我可以将参数传递给我的fsyacc解析器吗?
EN

Stack Overflow用户
提问于 2012-09-19 12:27:17
回答 1查看 293关注 0票数 3

我知道有可能将参数传递给lexer:

代码语言:javascript
复制
rule tokenize scope = parse
  | whitespace       { tokenize scope lexbuf                       }
  | newline          { newline lexbuf; tokenize scope lexbuf       }

但我无法以类似的方式定义解析器开始符号。

我试图这样定义它:(多亏了问题)

代码语言:javascript
复制
%type < (IScope, AST.Script) Fun > Script

// with the following definition in the head section of the parser:
type ('a,'b) Fun = 'a -> 'b

但是这样的话,我就必须定义每个非终端符号,他们都会返回lambdas。但这不是我想要实现的,我希望能够在几个非终端中访问scope参数,并在解析期间执行它们的操作。

我注意到在ParserLocalStore类型中有一个IParseState,它只包含LexBuffer (仅通过调试检查)。由于我在每个非终端中都可以通过parseState访问它,我可以在其中存储参数吗,还是说这是个坏主意?

我考虑在解析器的头部分使用可变变量,但是它们是静态的(我认为?)这会阻止我同时解析多个输入..。

编辑:

目前,我将scope参数存储在特定的令牌中:

代码语言:javascript
复制
%token <string * IScope> IDENT

我将scope传递给Lexer,当他创建它们时,它会嵌入到相关的令牌中.我真的不喜欢这个解决方案,但我想不出更好的办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-24 06:55:03

Dictionary<string, obj>中有一个LexBuffer,它也可以通过parseState获得。由于没有找到更好的解决方案,我最终将参数存储在那里。

我意识到,这很可能不打算以这种方式使用,也可能无法在fsyacc的未来版本中使用,但我现在坚持使用它。如果有人需要这样做,我把我创建的两个扩展方法留在这里,以便以更干净的方式访问参数:

代码语言:javascript
复制
type IParseState with
    member x.LexBuffer() = x.ParserLocalStore.["LexBuffer"] :?> LexBuffer<char>

type LexBuffer<'a> with
    member x.SomeParameter
        with get() = x.BufferLocalStore.["SomeParameter"] :?> SomeParamType
        and set(v) = x.BufferLocalStore.["SomeParameter"] <- v

既然还没有任何答案,我现在就接受这个答案。尽管可以自由地提出一个更好的解决方案,我会改变接受的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12494667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档