私は暇なときにLuafslexlexerに取り組んでおり、ocamllexのマニュアルを参考にしています。
長い文字列を正しくトークン化しようとしているときに、いくつかの問題が発生しました。「長い文字列」はとトークンで区切られ'[' ('=')* '['
ます。標識']' ('=')* ']'
の数は同じでなければなりません。=
最初の実装では、レクサーは[[
パターンを認識しないようでLBRACKET
、最長の一致ルールにもかかわらず2つのトークンを生成しましたが[=[
、バリエーションは正しく認識されました。さらに、正規表現は']' ('=')* ']'
、実際の長い文字列の「レベル」に関係なく、正しい終了トークンが使用されていることを確認できず、最初のキャプチャで停止しました。また、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);
(* ... *)
}
しかし、2つの理由で行き詰まっています。1つは、長い文字列を読み終えたら、いわば次のルールへのトークンを「プッシュ」できないと思います。次に、正しい終了トークンが見つかるまで文字ごとに読み取るというアイデアが好きではないため、現在のデザインは役に立たなくなります。
fslexでLuaの長い文字列をトークン化するにはどうすればよいですか?読んでくれてありがとう。