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 (* アクション *) }

生成されるコードは次のとおりです。

(楽しい (parseState : Microsoft.FSharp.Text.Parsing.IParseState) ->
      let _1 = (let データ = parseState.GetInput(1) in
                           (Microsoft.FSharp.Core.Operators.unbox データ: 文字列)
                ) の
      Microsoft.FSharp.Core.Operators.box((_1) : '人)
);

したがって、同じ方法でその parseState オブジェクトを操作できます。

%token<文字列> NAME
%%
人:
       名前 名前 { parseState.DoStuff(); }

rhs_start_posメソッドは基本的にこれを行います:

let startPos,endPos = parseState.InputRange(n)

はこれを行いsymbol_end_posます:

let startSymb,endSymb = parseState.ResultRange

これが役立つことを願っています

于 2009-06-04T04:54:11.837 に答える