2009-06-04 11 views
3

FSYaccを使用してパーサーを生成すると、スレッドセーフになりますか?FSYaccスレッドで生成されたパーサーは安全ですか?

機能

Parsing.rhs_start_posParsing.symbol_end_pos

は、彼らが現在を取得していることを前提とするために私につながるそれらに渡される任意の状態を、持っているを表示されませんので、私は尋ねる唯一の理由があります共有ロケーションからの非ターミナル/シンボル、これは正しいですか?私は、彼らが静的プロパティから

internal static IParseState parse_information 
{ 
    get 
    { 
     return parse_information; 
    } 
    set 
    { 
     parse_information = value; 
    } 
} 

をpostionを取得していることを確認コードを反映した後

は、この正しいですか?もしそうなら、私はそれについて何ができますか?

編集:私は本当にこのため、しかし、自分の質問に答えることを好きではない

答えて

2

...私はまたset_parse_state

public static void set_parse_state(IParseState x) 
{ 
    parse_information = x; 
} 

という静的メソッドを参照してくださいしかし、それはまだ文句を言わない私の問題を解決しますいつか誰かに悲しみの世界を救うことができます。

解析モジュールで提供される関数はスレッドセーフではないことが判明しました。 しかし、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オブジェクトと対話することができます同じように。

私は願っています
 
let startSymb,endSymb = parseState.ResultRange 

が、これは

を支援します。

 
let startPos,endPos = parseState.InputRange(n) 

symbol_end_posこの行います

 
%token<string> NAME 
%% 
Person: 
     NAME NAME { parseState.DoStuff(); } 

rhs_start_pos方法は、基本的に、このありません

関連する問題