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

时间:2009-06-04 04:02:21

标签: f# fsyacc

如果我使用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;
}

但那仍然不能解决我的问题...

1 个答案:

答案 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

我希望这会有所帮助