fslex - 如何在两个令牌集之间切换?

时间:2014-03-28 22:50:30

标签: f# fslex

我正在尝试使用fslexfsyacc编写一个小型DSL解析器。输入由两种不同语言的交织块组成,这两种语言需要不同的lexing规则。如何编写fslex文件以支持该文件?

(我想类似的情况是如何为c语言定义fslex文件,但支持内联汇编,这需要不同的lexing规则?)

我目前的情况是这样的:

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

and core = parse
    | ...

问题是,一旦core解析器返回一个令牌,输入的下一部分就会传递给tokenize。但是,我想在core状态保持(原样)。我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:4)

我实际上设法找到了自己的解决方案。我定义了自己的tokenizer函数,它根据BufferLocalStore状态决定要调用哪个tokenizer。

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 }
...

令人惊讶的是如何简单地提出问题可以引导您找到解决方案,我希望这可以帮助除了我以外的人:)