Lisp 処理系以外でも S 式を解釈できると何かと便利だろうと、BNF を書いてみることにしました。簡略版で十分と、リストはクォートとドット対に限り、複合リテラルは扱わず、シンボルと整数・浮動小数点数・文字列を字句にまとめ記号 ATOM として受け入れることにします。ブロックコメントは使わないことにして、空白と行単位コメントは字句解析で読み飛ばすことにします。ドットは、リストの同一レベルには一回だけ使え、左側には一個以上、右側には一個のリストが必要です。ドットを使わないリストはゼロ個以上のリストの並びになります。最初に、素直に EBNF 風に記述します。 input : list* ; list : '(' list* (list '.' list )? ')' | "'" list | ATOM ;これを BNF へ書き直していきます。input の書き直しは定石通りです。非終端記号