F# FSYacc生成的解析器是线程安全的吗?
如果我使用FSYacc生成解析器,它会是线程安全的吗 我问这个问题的唯一原因是因为F# FSYacc生成的解析器是线程安全的吗?,f#,fsyacc,F#,Fsyacc,如果我使用FSYacc生成解析器,它会是线程安全的吗 我问这个问题的唯一原因是因为 Parsing.rhs\u start\u pos和Parsing.symbol\u end\u pos 似乎没有任何状态传递给它们,这会导致我假设它们从共享位置获取当前的非终端/符号,对吗 在反映了代码之后,我看到他们是从一个静态属性获取位置的 internal static IParseState parse_information { get { return parse_i
Parsing.rhs\u start\u pos
和Parsing.symbol\u end\u pos
似乎没有任何状态传递给它们,这会导致我假设它们从共享位置获取当前的非终端/符号,对吗
在反映了代码之后,我看到他们是从一个静态属性获取位置的
internal static IParseState parse_information
{
get
{
return parse_information;
}
set
{
parse_information = value;
}
}
这是正确的吗?如果是,我能做些什么
编辑:我还看到一个名为set\u parse\u state
public static void set_parse_state(IParseState x)
{
parse_information = x;
}
但是这仍然不能解决我的问题…我真的不想回答我自己的问题,但是因为这可以在将来的某一天拯救别人一个悲伤的世界,我会的 事实证明,解析模块中提供的函数不是线程安全的。 但是,您可以在非终端操作中访问
parseState
“变量”,该变量的类型为IParseState
例如(粗糙但与我一起工作):
如果你有一个非终结符,比如
%token<string> NAME
%%
Person:
NAME NAME { $1 (* action *) }
而符号\u end\u pos
执行以下操作:
let startPos,endPos = parseState.InputRange(n)
let startSymb,endSymb = parseState.ResultRange
让startSymb,endSymb=parseState.ResultRange
我希望这有帮助
let startPos,endPos = parseState.InputRange(n)
let startSymb,endSymb = parseState.ResultRange