ocamllexのマニュアルを参考にして、私は暇な時間にLua fslex lexerに取り組んできました。fslexのLua長い文字列
長い文字列を正しくトークン化しようとしているうちに、いくつかの問題が発生しました。 「長い文字列」は、'[' ('=')* '['
と']' ('=')* ']'
のトークンで区切られています。 =
記号の数は同じでなければなりません。
最初の実装では、レクサーは一致ルールが最も長くても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);
(* ... *)
}
しかし、私はこだわっている、二つの理由:まず、私は「私ができるとは思いません言い換えると、長い文字列を読み終えたら、次の規則へのトークンを押します。第二に、私は現在のデザインが役に立たないように、右の閉じトークンが見つかるまでcharをcharで読むという考え方が嫌いです。
fslexでLuaの長い文字列をどのようにトークン化できますか?読んでくれてありがとう。
オフハンドでは、ちょうど言いたがっています:あなたはそれをレックスではなく常に解析することを選択する必要があります。 – Brian
@Brian、詳しく教えていただけますか?:)私は、元の長い文字列を作成するために無関係なトークンのシーケンスを解析する方法を理解しようとしていますが、文字列のすべての内容に対してトークンを生成することができます。ご意見ありがとうございます。 – Raine
ええ、それはおそらく良い戦略ではない、私はそこにそれを投げていた。 – Brian