入力補完のためのパーサ

友達が悩んでいたので、ちょっと考えてみた。HTMLやプログラムのソースコードを入力中に、適切な補完候補を出してくれるエディタはたくさんあるが、ああいうのはどうやってるんだろう、という疑問。

3分ほど考えて、

html ::= tag | CDATA
tag ::=
    | <                                          # 1
    | </                                         # 2
    | < tag-name attribute* >
    | < tag-name attribute*
    | </ tag-name
attribute ::= 
    | attribute-name                             # 3
    | attribute-name =                           # 4
    | attribute-name = " attribute-value         # 4
    | attribute-name = " attribute-value "

みたいな、入力補完専用のパーサを用意してやればできるんじゃない?、といっておいた。1ならタグの候補を出し、2なら最後に開かれたタグを出す、3なら入力できる属性の候補を出し、4なら入力できる属性の値の候補を出す、とかすればいけそうだと思った。

でまあ、それを実際にパーサだけ書いてみたら、なかなかうまくいっている感じ。もちろん、ある瞬間にはエラーになることもあるが、それは無視して補完候補を出さなければ良いだけの話。