如果我使用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;
}
但这仍然无法解决我的问题...
最佳答案
我真的不喜欢回答我自己的问题,但是由于有一天我可以为别人省去一个悲伤的世界。
事实证明,解析模块中提供的功能不是线程安全的。
但是,您可以做的是在非终端操作中访问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
我希望这有帮助