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

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

我目前拥有的是这样的:

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

and core = parse
    | ...

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

谢谢!

最佳答案

我实际上设法自己找到了解决方案。我定义了自己的分词器函数,它根据 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 }
...

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

关于f# - fslex - 如何在两个 token 集之间切换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22724493/

10-12 00:11