2009-06-04 3 views
3

FSYacc를 사용하여 파서를 생성하면 스레드로부터 안전할까요?FSYacc 스레드에 의해 생성 된 파서가 안전합니까?

Parsing.rhs_start_posParsing.symbol_end_pos

할 기능이 들이 현재를 받고 있다고 가정하는 저를 이끌 것이다, 어떤 국가가 그들에 전달하도록 나타나지 때문에 물어 유일한 이유는 공유 위치의 비 터미널/기호가 맞습니까?

나는 그들이 정적 속성이 맞

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

에서받은 위치를 얻는 것을 볼 코드를 반영 후? 그렇다면 무엇을 할 수 있습니까?

편집 : 난 정말이 때문에 그러나, 내 자신의 질문에 대답하고 싶지 않다

답변

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 방법은 기본적으로이 수행