我正在尝试使用 fslex
和 fsyacc
编写一个小型 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/