2012-09-19 119 views
3

我知道這是可能的參數傳遞到詞法分析器:我可以將參數傳遞給我的fsyacc分析器嗎?

rule tokenize scope = parse 
    | whitespace  { tokenize scope lexbuf      } 
    | newline   { newline lexbuf; tokenize scope lexbuf  } 

,但我不能確定以類似的方式我解析器開始符號。

我試圖把它定義是這樣的:(感謝this問題)

%type < (IScope, AST.Script) Fun > Script 

// with the following definition in the head section of the parser: 
type ('a,'b) Fun = 'a -> 'b 

但後來我不得不這樣定義每一個非終端符號和他們都回lambda表達式。這不是我想要雖然實現的,我希望能夠幾個非終端中訪問scope參數和分析過程中執行他們的行動。

我注意到IParseState類型中有ParserLocalStore類型,其中只包含LexBuffer(只能通過調試進行檢查)。由於我在每一個非終端通過parseState訪問它,我也許能在那裏儲存參數,或者說是一個壞主意?

我想到了在解析器頭部分採用可變的變量,但他們是靜態的(我想?),而且會阻止我同時分析多個輸入...

編輯:

目前我儲存在特定的令牌scope參數:

%token <string * IScope> IDENT 

我通過scope的詞法,誰其嵌入相關令牌w ^如果他創造了它們......我真的不喜歡這個解決方案,但是我還是無法想出更好的東西。

+0

不是一個答案,但你有沒有考慮FParsec?參數傳遞很容易。 – Daniel

+0

目前不在。我們有另一個解析器項目,可能會在那裏使用ANTLR。如果我們(在某個時候)也決定使用ANTLR來處理當前的項目,那麼我可以更輕鬆地使用fsyacc進行移植。隨着解析器組合(據我所知至少)我沒有一個很清晰的語法和所要做的一切相當不同,而大部分一fsyacc/ANTLR解析器的結構似乎是相似的。 – enzi

回答

0

LexBuffer中有一個Dictionary<string, obj>,它也可以通過parseState獲得。沒有找到更好的解決方案,我最終在那裏存儲了我的參數。

我意識到,這極有可能是不希望以這樣的方式被使用,不得在fsyacc的未來版本中,但我堅持到現在它。如果有人需要做同樣的,我在這裏留下兩個擴展方法,我創建了訪問一個更清潔的方式我的參數:

type IParseState with 
    member x.LexBuffer() = x.ParserLocalStore.["LexBuffer"] :?> LexBuffer<char> 

type LexBuffer<'a> with 
    member x.SomeParameter 
     with get() = x.BufferLocalStore.["SomeParameter"] :?> SomeParamType 
     and set(v) = x.BufferLocalStore.["SomeParameter"] <- v 

由於沒有得到任何答案,但我會接受這個一個現在。 隨意但提出一個更好的解決方案,我會改變接受的答案。

相關問題