入力補完のためのパーサ
友達が悩んでいたので、ちょっと考えてみた。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なら入力できる属性の値の候補を出す、とかすればいけそうだと思った。
でまあ、それを実際にパーサだけ書いてみたら、なかなかうまくいっている感じ。もちろん、ある瞬間にはエラーになることもあるが、それは無視して補完候補を出さなければ良いだけの話。