7

OCamlLex で複数のトークンを返す方法はありますか?

インデント ベースの言語用のレクサーとパーサーを作成しようとしてDEDENTいます。インデント レベルが以前よりも低いことに気付いたときに、レクサーが複数のトークンを返すようにしたいと考えています。これにより、複数のブロックが終了したときにパーサーに通知できます。

この方法に従うことで、 and のドロップイン置換として and を使用できます。これは、これらINDENT2つのトークンがandトークンによって暗示されるためです。DEDENTBEGINENDINDENTDEDENT

4

1 に答える 1

7

トークンのリストを返します。パーサーがそれをネイティブに処理できない場合 (たとえば、ocamlyacc) - 間にキャッシュを挿入するだけです:

let cache =
  let l = ref [] in
  fun lexbuf ->
    match !l with
    | x::xs -> l := xs; x
    | [] -> match Lexer.tokens lexbuf with
            | [] -> failwith "oops"
            | x::xs -> l := xs; x

または、完全なドキュメントに対してレクサーを実行してから、完全なトークン ストリームに対してパーサーを実行することもできます。

ところで、ocaml+twtを見ましたか?

于 2010-08-09T07:16:53.020 に答える