我正在尝试使用fslex和fsyacc编写一个小型DSL解析器。输入由两种不同语言的交错块组成,它们需要不同的词法规则。我如何编写我的fslex文件来支持这一点?
(我想类似的情况是如何为c语言定义一个fslex文件,但支持内联程序集,这需要不同的词法规则?)
我现在的情况是这样的:
rule tokenize = parse
| "core" { core lexbuf }
...
and core = parse
| ...问题是,一旦core解析器返回令牌,则输入的下一部分将被传递给tokenize。但是,我希望将保持在core状态。我该怎么做?
谢谢!
发布于 2014-03-28 23:24:33
实际上,我自己找到了一个解决方案。我定义了自己的令牌程序函数,它根据令牌程序要调用的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 }
...令人惊讶的是,简单地问这个问题可以帮助你找到解决方案,我希望这能帮助我以外的人:)
https://stackoverflow.com/questions/22724493
复制相似问题