2014-03-28 32 views
3

我正在嘗試使用fslexfsyacc來編寫一個小的DSL解析器。輸入由兩種不同語言的交錯塊組成,這些語言需要不同的放鬆規則。我如何編寫我的fslex文件來支持?fslex - 如何在兩個令牌集之間切換?

(我想類似的情況是如何定義fslex文件爲C語言,但與內聯彙編,這需要不同的詞法規則的支持?)

什麼我現在是這樣的:

rule tokenize = parse 
    | "core"  { core lexbuf } 
    ... 

and core = parse 
    | ... 

的事情是,一旦得到令牌由core解析器返回時,輸入的下一部分被傳遞給tokenize代替。但我想(原樣)在core狀態。我怎麼做?

謝謝!

回答

4

我實際上設法找到了一個我自己的解決方案。我定義了我自己的標記器函數,它根據BufferLocalStore狀態決定調用哪個標記器。

let mytokenizer (lexbuf : LexBuffer<char>) = 
    if lexbuf.BufferLocalStore.["state"].Equals("core") then FCLexer.core lexbuf 
    else FCLexer.tokenize lexbuf 

let aString (x : string) = 
    let lexbuf = LexBuffer<_>.FromString x 
    lexbuf.BufferLocalStore.["state"] <- "fc" 
    let y = try (FCParser.PROG mytokenizer) lexbuf 
... 

而且我修改fslex輸入略有文件:

rule tokenize = parse 
    | "core"  { lexbuf.BufferLocalStore.["state"] <- "core"; core lexbuf } 
... 

多麼驚人的簡單問的問題可能會導致你的解決方案,我希望這可以幫助別人,除了我:)