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

我问的唯一原因是因为功能
Parsing.rhs_start_posParsing.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;
}

但这仍然无法解决我的问题...

最佳答案

我真的不喜欢回答我自己的问题,但是由于有一天我可以为别人省去一个悲伤的世界。

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

例如(粗略但与我合作):
如果您有非终端用户喜欢

%token NAME
%%
人:
NAME NAME {$ 1(* action *)}

生成的代码是:

(有趣(parseState:Microsoft.FSharp.Text.Parsing.IParseState)->
让_1 =(让data = parseState.GetInput(1)在
(Microsoft.FSharp.Core.Operators.unbox数据:字符串)
)在
Microsoft.FSharp.Core.Operators.box((_ 1):'Person)
);

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

%token NAME
%%
人:
NAME NAME {parseState.DoStuff(); }
rhs_start_pos方法基本上是这样做的:

让startPos,endPos = parseState.InputRange(n)

symbol_end_pos可以做到这一点:

让startSymb,endSymb = parseState.ResultRange

我希望这有帮助

10-08 17:04