トークンに分割する字句解析のところまで進んでるので、構文解析もさらっと流します。マスコット宣言についてのみ流れを追っているので、ParseLine();での字句解析が済むと、教本はCmdMascot();にて、マスコット文の種類の判別に進んでいます。このルーチンでParseExpression();という構文を判別するサブルーチンを行き来します。
教本でも、構文解析のところは難しいと思います云々書いてありますが、ParseExpression();辺りのコードは、チェックのための補助の関数をあちこち呼んだりする一方で、この解析が済むといよいよマスコットクラスのオブジェクトを生成するので、その前準備も必要になり、関数の数がまたまた増えます(マスコット宣言文に関係するコードだけに絞ってるのにね)( ´ー`)フゥー
制作メモでは…
制作メモ[v09] ———————————————————————————–
構文解析を行い、CMascotのオブジェクトを生成するのに伴い、Cvalue、CImage の両クラスも一気に作った。
▼CmdMascotSub(true, mascot_name, image_name, 0, 0);の直前まで
CInterpreter::CmdMascot()から、CInterpreter::ParseExpression()の構文解析部分で動きを把握する為、ログをかなり埋め込んだ。
CInterpExpr.cppの CInterpreter::NewStrConst()で、CStrValue型の配列の int型の 添え字StrConstsPtr を CInterpreterのコンストラクタで
初期化し忘れていたので、プログラムが誤動作した。ここを設定し忘れるとcase TK_STRING:のvalue_stack.push(NewStrConst(token->GetStrValue()));
から戻ってこれなくなる[先に進めなくなる]<==デバッカでスタックに「ぽもも」が二番目(一番目はダミー)の要素として入ってくるか確認する必要がでてくる。
★例外クラスを追加[宣言…CLexer.h で、EScriptErrorとしてクラス宣言[インライン関数なので、CLexer.cppにはない]
例外クラスのオブジェクトは、CInterpreter.cppの先頭で7個生成。
-------------------------------------------------------------------------------
と、なっています。また、CInterpreter::Continue();では、構造が複雑になってきたので原文に従い、try~catch文を機能させるように戻しています。
分かりにくいところだと思います。なので、ログをいっぱいv09では吐いてます(;´Д`)
ソースコード[v09.lzh]
コメント