gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:48:27 25 4
gpt4 key购买 nike

我知道可以将参数传递给词法分析器:

rule tokenize scope = parse
| whitespace { tokenize scope lexbuf }
| newline { newline lexbuf; tokenize scope lexbuf }

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

我试着这样定义它:(感谢 this 问题)

%type < (IScope, AST.Script) Fun > Script

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

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

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

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

编辑:

目前我将 scope 参数存储在特定的标记中:

%token <string * IScope> IDENT

我将 scope 传递给 Lexer,它在创建相关标记时将其嵌入到相关标记中……我真的不喜欢这个解决方案,但我无法想出更好的方法然而。

最佳答案

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

我知道这很可能不打算以这种方式使用,并且在 fsyacc 的 future 版本中可能不可用,但我现在坚持使用它。如果有人需要做同样的事情,我将我创建的两个扩展方法留在这里以更清晰的方式访问我的参数:

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

由于还没有任何答案,我暂时接受这个。请随意提出更好的解决方案,我会更改已接受的答案。

关于parsing - 我可以将参数传递给我的 fsyacc 解析器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12494667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com