gpt4 book ai didi

f# - FSYacc 线程生成的解析器是否安全?

转载 作者:行者123 更新时间:2023-12-02 02:37:14 26 4
gpt4 key购买 nike

如果我使用 FSYacc 生成解析器,它会是线程安全的吗?

我问的唯一原因是因为功能

Parsing.rhs_start_posParsing.symbol_end_pos

似乎没有向它们传递任何状态,这会让我假设它们正在从共享位置获取当前的非终端/符号,这是正确的吗?

反射(reflect)代码后,我看到他们从静态属性中获取位置

internal static IParseState parse_information
{
get
{
return parse_information;
}
set
{
parse_information = value;
}
}

这是正确的吗?如果是这样,我该怎么办?

编辑:我还看到一个名为 set_parse_state 的静态方法

public static void set_parse_state(IParseState x)
{
parse_information = x;
}

但这仍然不能解决我的问题...

最佳答案

我真的不想回答我自己的问题,但是因为这可以在某一天为其他人挽救一个悲痛的世界,我会的。

事实证明,解析模块中提供的函数不是线程安全的。然而,您可以做的是在您的非终端操作中访问 parseState“变量”,它是 IParseState 类型。

例如(粗糙但和我一起工作):如果你有一个像

这样的非终端
%token<string> NAME%%Person:       NAME NAME { $1 (* action *) }

生成的代码是:

(fun (parseState : Microsoft.FSharp.Text.Parsing.IParseState) ->      let _1 = (let data = parseState.GetInput(1) in                            (Microsoft.FSharp.Core.Operators.unbox data : string)                ) in      Microsoft.FSharp.Core.Operators.box((_1) : 'Person));

因此您可以以相同的方式与该 parseState 对象进行交互。

%token<string> NAME%%Person:       NAME NAME { parseState.DoStuff(); }

rhs_start_pos 方法基本上是这样做的:

let startPos,endPos = parseState.InputRange(n)

symbol_end_pos 这样做:

let startSymb,endSymb = parseState.ResultRange

希望对你有帮助

关于f# - FSYacc 线程生成的解析器是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/948543/

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