ВУЗ:
Составители:
52
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
Лист
la.cpp #include "la.h" State = SNP; for(; State != SV && digit(); gc()) // перевод строки в нижний регистр S += cur; void tolower(string &s){ } for (unsigned long i = 0; i < s.length(); i++) } else if ((digit() || cur == '+' || cur == '-') && s[i] = tolower(s[i]); (S[S.length() - 1] == 'e' || S[S.length() - 1] == 'E')){ // } порядок State = SNP; int Scanner::Scan(){ for(gc(); State != SV && digit(); gc()) par t; S += cur; pos = 0; } State = SH; put(&A->N); errcode = 0; out(2, z); gc(); } else if (cur == '{'){ // комментарий while(State != SV && State != SER){ State = SC; while(State != SV && cur != '\n' && for(gc(); State != SV && cur != '}'; gc()); isspace(cur)) if (State == SV){ gc(); errcode = 1; if (State == SV) break; break; } if (letter()){ // буква gc(); State = SI; } else if (cur == '<'){ // < <= <> S = cur; State = SL; for(gc(); State != SV && (letter() || gc(); digit()); gc()) if (cur == '=' || cur == '>'){ S += cur; S = "<"; //tolower(S); S += cur; look(&A->R); gc(); if (z >= 0) } out(0, z); else else { S = "<"; put(&A->I); look(&A->D); out(3, z); out(1, z); } } else if (cur == '>'){ // > >= } else if (digit()){ //число State = SG; State = SN; gc(); S = cur; if (cur == '='){ for(gc(); State != SV && (digit() || S = ">="; strchr("ABCDEFabcdef", cur)); gc()) gc(); S += cur; } if (strchr("HhDdOoBb", cur)){ else S += cur; S = ">"; gc(); look(&A->D); } else if (cur == '.'){ // дробная часть out(1, z); State = SND; } else if (cur == ':'){ // : := S += cur; State = SS; for(gc(); State != SV && digit(); gc()) gc(); S += cur; if (cur == '='){ if (cur == 'e' || cur == 'E'){ // порядок S = ":="; S += cur; gc(); gc(); } State = SNS; else if (cur == '+' || cur == '-'){ S = ":"; S += cur; look(&A->D); gc(); out(1, z); } Лист 32 52