Ишакова Е.Н. Разработка компиляторов - Методические указания к курсовой работе (1082246), страница 9
Текст из файла (страница 9)
Scanner S; // сканер
void InTables(char *fname); // ввод таблиц R и D из файла
void OutTable(TStringGrid * G, wordtable * X); // вывод таблицы в StringGrid
int Scan(string s); // сканирование
string ErrorMsg(int code); // сообщение об ошибке по коду
string GetResult(); // сформировать результат в виде строки
void OutTables(char *fname); // вывод таблиц I и N в файл
void OutResult(char *fname); // вывод результата в файл
};
31
la.cpp
#include "la.h"
// перевод строки в нижний регистр
void tolower(string &s){
for (unsigned long i = 0; i < s.length(); i++)
s[i] = tolower(s[i]);
}
int Scanner::Scan(){
par t;
pos = 0;
State = SH;
errcode = 0;
gc();
while(State != SV && State != SER){
while(State != SV && cur != '\n' && isspace(cur))
gc();
if (State == SV)
break;
if (letter()){ // буква
State = SI;
S = cur;
for(gc(); State != SV && (letter() || digit()); gc())
S += cur;
//tolower(S);
look(&A->R);
if (z >= 0)
out(0, z);
else {
put(&A->I);
out(3, z);
}
} else if (digit()){ //число
State = SN;
S = cur;
for(gc(); State != SV && (digit() || strchr("ABCDEFabcdef", cur)); gc())
S += cur;
if (strchr("HhDdOoBb", cur)){
S += cur;
gc();
} else if (cur == '.'){ // дробная часть
State = SND;
S += cur;
for(gc(); State != SV && digit(); gc())
S += cur;
if (cur == 'e' || cur == 'E'){ // порядок
S += cur;
gc();
State = SNS;
if (cur == '+' || cur == '-'){
S += cur;
gc();
}
State = SNP;
for(; State != SV && digit(); gc())
S += cur;
}
} else if ((digit() || cur == '+' || cur == '-') && (S[S.length() - 1] == 'e' || S[S.length() - 1] == 'E')){ // порядок
State = SNP;
for(gc(); State != SV && digit(); gc())
S += cur;
}
put(&A->N);
out(2, z);
} else if (cur == '{'){ // комментарий
State = SC;
for(gc(); State != SV && cur != '}'; gc());
if (State == SV){
errcode = 1;
break;
}
gc();
} else if (cur == '<'){ // < <= <>
State = SL;
gc();
if (cur == '=' || cur == '>'){
S = "<";
S += cur;
gc();
}
else
S = "<";
look(&A->D);
out(1, z);
} else if (cur == '>'){ // > >=
State = SG;
gc();
if (cur == '='){
S = ">=";
gc();
}
else
S = ">";
look(&A->D);
out(1, z);
} else if (cur == ':'){ // : :=
State = SS;
gc();
if (cur == '='){
S = ":=";
gc();
}
else
S = ":";
look(&A->D);
out(1, z);
32
53