C++ 構文解析入門

エラーメッセージに行番号を加える

これまでのエラーメッセージでは起きたエラーが何かということは判りましたが、それがどこで起きたのかということは判りませんでした そこでエラーメッセージに行番号を加えてどこで発生したエラーなのかも判るようにしてみましょう 仕組み 解析器で改行を数…

解析器と構文木と評価器を分ける

前回 0 除算の実行時エラーの処理がノードのクラスにありました ノードのクラスなのに実行時のエラー処理まで持っているのは美しくないですね これはノードのクラスに評価器の機能まで持たせてしまっているのが原因でした 構文木と評価器とは分けてしまいま…

構文木を使う

ここまでは解析と評価を一度に行ってきましたが、普通は解析処理と評価/実行の処理を分けるようにします解析処理は入力文字列が文法に合っているかどうかをチェックしながら出現した演算子や数値などの文法要素を評価の順番に並べたリストを作ることを仕事…

コメントも書けるようにする

ここまでの入力文字列中に改行を使うことはできましたが、コメントを書くことはできませんでした そこで入力文字列中に C/C++ 風のコメントがあったときはその部分を無視することができるようにしてみましょう 仕組み コメントは式の評価には関係ないので構…

実数も使えるようにする

これまでは使える数値は整数だけで実数を指定する方法がありませんでした 実数も使えるようにしてみましょう 仕組み 実数も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_comma 部分式_comma ::= 部分式_add_s…

単項演算子も使えるようにする

これまでは負の数を指定する方法がありませんでした 単項演算子をサポートすることで負の数も使えるようにしてみましょう 仕組み 単項演算子も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_comma 部分式_comm…

カンマ演算子も使えるようにする

実はカンマ(,)も演算子です このカンマ演算子を使えるようにしてみましょう 仕組み カンマ演算子も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_comma 部分式_comma ::= 部分式_add_sub 部分式_comma_ 部…

括弧も使えるようにする

演算子の優先順位というものを理解したところで、今度は括弧が使えるようにしてみましょう 仕組み 括弧も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_add_sub 部分式_add_sub ::= 部分式_mul_div_mod 部分式…

掛け算、割り算もできるようにする

足し算、引き算ができるようになったのですから、次は掛け算、割り算ができるようにしてみましょう 仕組み 掛け算と割り算も使えるようにしたパーサが処理すべき式は必ず次のような形式になっています 完結式 ::= 部分式_add_sub 部分式_add_sub ::= 部分式_…

足し算、引き算ができるようにする

まずは単純に数値の足し算、引き算ができるようにしてみましょう 仕組み パーサが処理すべき式はたぶん次のような形式になっているでしょう 完結式 ::= 部分式 部分式 ::= 数値 演算子 部分式 演算子 ::= + あるいは − 数値 ::= 16進数 あるいは 8進数 ある…

C++ 構文解析入門

はじめに 近年、組み込み環境でもスクリプト言語への関心が高まっていますが、そういった言語処理系を書く際に必要となってくるのが字句解析、構文解析です ここでは簡単な再帰下降型のパーサを例に、実際に実装してみながら構文解析について学んでゆきまし…