私は言語のフロントエンドを書いています ( by ocamllex
and ocamlyacc
)。
したがって、フロントエンドはAbstract Syntax Tree (AST)
プログラムからビルドできます。次に、AST を受け取ってプログラムを出力する pretty printer をよく作成します。後で AST をコンパイルまたは分析するだけの場合、ほとんどの場合、印刷されたプログラムが、空白に関して元のプログラムとまったく同じである必要はありません。ただし、今回は、空白に関して元のプログラムとまったく同じプログラムを印刷するきれいなプリンターを作成したいと思います。
したがって、私の質問は、AST の種類をあまり変更しないようにしながら、空白を処理するためのベスト プラクティスは何かということです。AST の各型に (空白の) 数を追加したくありません。
たとえば、これは私が現在 で空白を処理する (つまり、スキップする) 方法ですlexer.mll
。
rule token = parse
...
| [' ' '\t'] { token lexbuf } (* skip blanks *)
| eof { EOF }
これとフロントエンドの他の部分を変更して、後で印刷するために空白を正しく考慮に入れる方法を知っている人はいますか?