hinshiba.net

再帰下降構文解析法を用いてコマンドのネストを実装

再帰下降構文解析法を用いてコマンドのネストを実装

Cの標準ライブラリだけで字句解析からとあるアプリケーションのコマンドのランタイムを実装

技術スタック

概要

大学のC言語の講義課題である名簿管理プログラムに,独自のプログラミング言語 namep (NAME table Processor) をお遊びで組み込みました. 課題で定められた%Pや%Sなどの名簿操作コマンドを順次実行できるようにするところから始まり,条件分岐を導入することでFIZZBUZZを処理できるようにしました.

課題の仕様上,入力にはCSV形式の名簿レコードと % から始まるコマンドが混在します.そのため字句解析では先読みを行い,どちらの入力かを判定しています. 文法はLL(1)となるよう設計し,再帰下降構文解析でASTを構築してから評価します. ( ) で囲んだコマンド列は評価結果が別のコマンドの引数として渡されるため,コマンドを自由にネストできます.

課題のコマンドに加えて,%if や %while などの制御構文,%set や %put などの変数操作,%mod や %lt などの演算,%tget や %teditなどの名簿テーブル操作を独自に実装しました. これらを組み合わせると,次のようにFizzBuzzが書けます.

%set $a 1
%while (%lt $a 20 ) (
    %set $b $a
    %if (%eq 0 (%mod $a 3 ) ) (%set $b FIZZ )
    %if (%eq 0 (%mod $a 5 ) ) (%set $b BUZZ )
    %if (%eq 0 (%mod $a 15 ) ) (%set $b FIZZBUZZ )
    %put $b
    %inc $a
)

EmscriptenでWebAssemblyにコンパイルし,このサイトにデプロイしています.namepのプレイグラウンドからブラウザ上で実際に実行できます.

外部リンク