計言語の字句解析の課題
課題の仕様が適当なので細部も適当.
実用性は皆無
追記
定数,変数(関数),演算子,予約語を解析
変数と関数は区別しない
演算子は+-*/=しか認識しない
その他もろもろの不具合あり
#include <iostream> #include <cstdio> #include <string> #define MAXLINE 120 //1行の最大文字数 enum strtype{ LETTER, //英字 DIGIT, //数字 DELIMITER, //記号 OPERATE //演算子 }; using namespace std; int init(); //初期化関数 int end(); //終了関数 char nextChar(); //文字読み取り string reserveword[] = {"auto","const","double","float","int","short","struct","unsigned", "break","continue","else","for","long","signed","switch","void", "case","default","enum","goto","register","sizeof","typedef", "char","do","extern","if","return","static","union","while", "_bannin"//番人 }; //予約語リスト FILE *fp; //ソースファイル char chlist[255]; //文字の種類を分類する配列 int main() { init(); string temp,str; char ch; ch = nextChar(); while(true){ if(chlist[ch]==DIGIT){ //定数の読み取り while(chlist[ch] == DIGIT){ temp += ch; ch = nextChar(); if(chlist[ch] == LETTER){ cout << "ERROR" << (temp += ch) << endl; } } cout << "定数 "; temp = ""; } else if(chlist[ch] == LETTER){ //変数(関数)読み取り while(chlist[ch] != DELIMITER && chlist[ch] != OPERATE){ //記号か演算子が発生するまで読み取り temp += ch; ch = nextChar(); } str = "変数(関数) "; for(int i=0;reserveword[i] != "_bannin";i++){ //予約語かどうかチェック if(temp == reserveword[i]){ str = "予約語 "; break; } } cout << str; temp = ""; } else if(chlist[ch]==OPERATE){ str = "演算子 "; cout << str; ch = nextChar(); } else { ch = nextChar(); } } end(); return 0; } //------------------初期化関数------------------- int init() { int i; if((fp = fopen( "source.txt", "r" )) == NULL){ //ファイルのオープン cout << "ファイルの読み取りエラー" << endl; exit(-1); } for(i=0;i < 255;i++)chlist[i] = DELIMITER; //LETTERとDIGITとOPARATE以外は記号とする for(i='A';i<='Z';i++) chlist[i] = LETTER; //A〜ZをLETTERとする for(i='a';i<='z';i++) chlist[i] = LETTER; //a〜zをLETTER for(i='0';i<='9';i++) chlist[i] = DIGIT; //0〜9はDIGIT chlist['+'] = chlist['-'] = chlist['*'] = chlist['/'] = chlist['='] = OPERATE; return 0; } //------------------終了関数-------------------- int end() { fclose(fp); return 0; } char nextChar() { static char line[MAXLINE]; static char lineIndex = -1; char ch; if(lineIndex == -1){ //ファイルを1行読む if(fgets(line,MAXLINE,fp) != NULL){ lineIndex = 0; } else{ cout << "end file" << endl; exit(1); } } if((ch = line[lineIndex++]) == '\n') { lineIndex = -1; cout << endl; } return ch; }