3

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

我问的唯一原因是因为功能

Parsing.rhs_start_posParsing.symbol_end_pos

似乎没有任何状态传递给它们,这将导致我假设他们正在从共享位置获取当前的非终端/符号,这是正确的吗?

反映代码后,我看到他们正在从静态属性中获取位置

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;
}

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

4

1 回答 1

2

我真的不喜欢回答我自己的问题,但是因为这可能会在某天为别人拯救一个悲伤的世界。

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

例如(粗略但和我一起工作):如果你有一个 NonTerminal 喜欢

%token<字符串> NAME
%%
人:
       NAME NAME { $1 (* action *) }

生成的代码是:

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

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

%token<字符串> NAME
%%
人:
       NAME NAME { parseState.DoStuff(); }

rhs_start_pos方法基本上是这样做的:

让 startPos,endPos = parseState.InputRange(n)

并且这样symbol_end_pos做:

让 startSymb,endSymb = parseState.ResultRange

我希望这有帮助

于 2009-06-04T04:54:11.837 回答