如果我使用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;
}
但那仍然不能解决我的问题...
答案 0 :(得分:2)
我真的不喜欢回答我自己的问题,但是因为有一天我会拯救别人一个悲伤的世界。
事实证明,解析模块中提供的函数不是线程安全的。
但是,您可以在非终结操作中访问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
我希望这会有所帮助