我正在尝试使用fslex
和fsyacc
编写一个小型DSL解析器。输入由两种不同语言的交织块组成,这两种语言需要不同的lexing规则。如何编写fslex
文件以支持该文件?
(我想类似的情况是如何为c语言定义fslex
文件,但支持内联汇编,这需要不同的lexing规则?)
我目前的情况是这样的:
rule tokenize = parse
| "core" { core lexbuf }
...
and core = parse
| ...
问题是,一旦core
解析器返回一个令牌,输入的下一部分就会传递给tokenize
。但是,我想在core
状态保持(原样)。我该怎么做?
谢谢!
答案 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 }
...
令人惊讶的是如何简单地提出问题可以引导您找到解决方案,我希望这可以帮助除了我以外的人:)