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

3
如果我使用FSYacc生成解析器,它是否是线程安全的?
我问这个问题的唯一原因是因为函数Parsing.rhs_start_pos和Parsing.symbol_end_pos似乎没有传入任何状态,这会让我认为它们正在从共享位置获取当前的NonTerminal/Symbols,这是正确的吗?
反射代码后,我发现它们从静态属性获取了位置。
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;
}

但这仍然不能解决我的问题...
1个回答

2

我真的不喜欢回答自己的问题,但是由于这可能会在未来为其他人节省大量麻烦,所以我会。

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

例如(大致但与我合作):

%token<string> NAME
%%
Person:
       NAME NAME { $1 (* 操作 *) }

生成的代码如下:

(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

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接