4

fslexandを使用して小さな DSL パーサーを作成しようとしていfsyaccます。入力は、異なる字句規則を必要とする 2 つの異なる言語のチャンクをインターリーブすることで構成されます。fslexそれをサポートするためにファイルを作成するにはどうすればよいですか?

(同様のケースは、c 言語用のファイルを定義する方法であると思いfslexますが、インライン アセンブリをサポートしており、異なる字句規則が必要ですか?)

私が現在持っているものは次のようなものです:

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

and core = parse
    | ...

問題は、トークンがcoreパーサーによって返されると、代わりに入力の次の部分が渡されるtokenizeことです。しかし、私は(いわば)その状態にとどまりたいと思っています。coreそれ、どうやったら出来るの?

ありがとう!

4

1 に答える 1

5

私は実際に自分で解決策を見つけることができました。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 }
...

質問をするだけで解決策にたどり着くことができるのは驚くべきことです。これが私以外の誰かの助けになることを願っています:)

于 2014-03-28T23:24:33.043 に答える