4

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

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

我目前拥有的是这样的:

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 回答