我在业余时间里一直在开发一个Lua fslex词法分析器,参考了ocamllex手册。
在尝试正确地标记长字符串时,我遇到了一些问题。 "长字符串"由'[' ('=')* '['
和']' ('=')* ']'
标记界定; =
符号的数量必须相同。
在第一次实现中,词法分析器似乎无法识别[[
模式,尽管最长匹配规则,产生了两个LBRACKET
标记,而[=[
和变体被正确识别。此外,正则表达式未能确保使用正确的闭合标记,停止于第一个']' ('=')* ']'
捕获,无论实际的长字符串“级别”如何。另外,fslex似乎不支持正则表达式中的"as"结构。
let lualongstring = '[' ('=')* '[' ( escapeseq | [^ '\\' '[' ] )* ']' ('=')* ']'
(* ... *)
| lualongstring { (* ... *) }
| '[' { LBRACKET }
| ']' { RBRACKET }
(* ... *)
我一直在尝试使用词法分析器中的另一个规则解决这个问题:
rule tokenize = parse
(* ... *)
| '[' ('=')* '[' { longstring (getLongStringLevel(lexeme lexbuf)) lexbuf }
(* ... *)
and longstring level = parse
| ']' ('=')* ']' { (* check level, do something *) }
| _ { (* aggregate other chars *) }
(* or *)
| _ {
let c = lexbuf.LexerChar(0);
(* ... *)
}
但我卡住了,有两个原因:首先,我不认为我可以在读取长字符串后将标记“推送”到下一个规则;其次,我不喜欢逐个字符读取直到找到正确的闭合标记的想法,使当前设计无用。
如何在fslex中标记Lua长字符串?谢谢阅读。