前回はインタプリタの概要についてを行いました。
今回は字句解析プログラムの内容について考えてみようと思います。
前回の字句解析で出てきた文字について整理します。
- 演算子
- 制御文判別子
- 区切り記号
- 関数判別子
- 識別子
- 整数
- 文字列
今回は判断が簡単な5, 6, 7について考えて見ます。
5.識別子
識別子は int a;
などとあるときに a
にあたる部分のことを指します。
c言語などでは最初の文字がアルファベットもしくはアンダーバーで始まるものを識別子として認識されます。
ここでも同様に考えるとすると以下の手順を踏む必要があります。
- 最初の文字はアルファベットかアンダーバーであるか
- 使用できない文字列が含まれていないか
これだけですので実装は簡単です
std::string str; // スクリプトの内容 static int Pos; // スクリプトの位置 bool ReadIdentify() { int n = Pos; // 何文字目を読んでいるか std::string identify; // 識別子の名前 str = ReadLine(); // 1行読み出します。 if(!(IsAlpha(str[n]) || str[n] == '_')) return false: // アルファベットかアンダーバー以外ならfalse n++; // 識別子に許される文字である限り読み続けます。 while(1) { if(IsDig(str[n] || IsAlpha(str[n]) || str[n] == '_') n++; else if(str[n] == ' ') break; else return false; } identify = str.substr(Pos, Pos - n); // identifyの中に識別子の単語(int test なら test)が入ります Pos = n; return true; } // アルファベットであるかどうか bool IsAlpha(char c) { return 'a' <= c <= 'z' || 'A' <= c <= 'Z'; } // 数字かどうか bool IsDig(char c) { return '0' <= c <= '9'; } |
6, 7はこれと同様であるのですぐに実装ができます。
これで ( 123 , abc, "mozi") (整数, 識別子, 文字列)の判断が可能となりました。
その他の文字については定型文字列にマッチしているかどうかといった内容で同様にチェックが可能となります。
つまり演算子 = とは文字列 "="にマッチしているかどうかといった判断により行われます。
これらの実装については第3回で行います。
そして今回のマトメとして読み出した内容を格納する必要があります。 格納しなければならない情報は以下の通りです
- 1.この文字列は何であったか
- この文字列の値は何か
- この文字列はなんと書かれていたか
となります。
では実装を行います。
class Token() { private: int id; // この文字列が何かを判別するidです int value; // 文字列の値です、今回はint型のみをサポートします。 strin str; // 文字列の名前です public: Token(int id, int value, std::string str); } vector <Token> Tokens; // 例で100というinteger文字列を格納する場合、以下のようにします。 Tokens.push_back(Token(integer, 100, "100")); |
以上で取り出した値を格納する準備ができました。
では今回はこのあたりで。