Se necesita con urgencia código de análisis léxico
# incluir & ltfstream & gt
# incluir & ltstring& gt
# incluir & ltstring.h & gt
# include & ltctype.h & gt
Usar espacio de nombres std
//Definición de matriz de palabras reservadas
char* ReserveWords[35] = {
" y ", "array", "begin", "case", "const", "div", "do", "downto", "else", "end", "file",
"para", "función", "ir a", "si", "en", "etiqueta", "mod", "nil", "no", "de", "o" , "empaquetado",
"procesar", "programar", "grabar", "repetir", "establecer", "luego", "para", "escribir", "hasta" ", " variable",
"mientras", "con"
};
char flecha[] = " ->;
char enter[]= "\ r \ n";
//Leer canal
char GetChar(if stream & src)
{
char cRet
src . get(cRet);
Devolver cRet
}
// Leer espacios
char GetBC(if stream & src)
{
char cRet
src get(cRet);
mientras. (cRet == ' ')
src . get(cRet);
Devolver cRet
}
//Símbolo de palabra de concatenación
void Concat(char *str, char c)
{
tamaño _ t n = strlen(str);
str[); n++]= c;
str[n]= ' \ 0 ';
}
//Determinar si es una palabra reservada.
Valor reservado booleano (const char* str)
{
bool bRet = false
for(int I = 0; i & lt35;i++)
{
if (_stricmp(ReserveWords[i], str) == 0)
{
bRet = true
Romper;
}
}
Devolver bRet
}
//Carácter de devolución de llamada
Recuperación de carácter (ifstream y ampsrc)
{
src.seekg(-1, IOs::cur); p> p>
Regresar "\0";
}
//Función de análisis
Analizador de espacios (ifstream y ampsrc, ofstream y amp daylight ahorrando tiempo )
{
char ch
char strToken[1024]= " ";
ch = GetBC(src);
p>
//Juzga el estado del identificador
if (isalpha(ch))
{
mientras (es alfa(ch)| | es dígito(ch)| | ch = = ' _ ')
{
Concat(strToken, ch);
ch = GetChar(fuente);
}
ch = retract(fuente
if(retain(strToken))
dst & lt& ltstrToken & lt& ltArrow& lt& lt"Palabra reservada"& lt& ltEnter;
Otro
dst & lt& ltstrToken & lt& ltArrow& lt& lt"Identificador"& lt& ltEnter;
}
//Juzga el valor numérico
else if (isdigit(ch))
{
while (isdigit(ch))
{
Concat(strToken, ch);
ch = GetChar(src);
}
Retraer(src);
dst & lt& ltstrToken & lt& ltarrow& lt& lt"número" & lt& ltenter;
} p>
//Determinar la situación de la cadena
else if (ch == '\ ' ')
{
Concat(strToken, ch );
ch = GetChar(src);
Y (ch! = '\'')
{
Concat(strToken, ch);
ch = GetChar(src);
}
if (ch!= '\'')
cerr & lt& lt"Cadena demasiado larga: ¡más de 1024 bytes!"& lt& ltendl
Otros
{
Concat(strToken, ch);
dst & lt& ltstrToken & lt& ltarrow& lt& lt" String " & lt& ltEnter; p>}
}
//Filtrar comentarios
else if (ch == '{ ')
{
blanco
le (GetChar(src)!= '}')
;
}
// Juzgue todos los operadores monoculares inequívocos.
else if (ch == '+')
dst & lt& ltch & lt& ltarrow& lt& lt" Plus " & lt& ltenter;
else if ( ch == '-')
dst & lt& ltch & lt& ltarrow& lt& lt"signo menos" & lt& ltenter;
else if (ch == '* ') p>
dst & lt& ltch & lt& ltarrow& lt& lt"múltiple" & lt& ltenter;
else if (ch == '/')
dst & lt& ltch & lt& ltarrow& lt& lt"except"& lt& ltenter;
else if (ch == '= ')
dst & lt& ltch & lt& ltarrow& lt& lt"equal"& lt& ltenter ;
else if (ch == '[')
dst & lt& ltch & lt& ltarrow& lt& lt"corchete izquierdo" & lt& ltenter;
else if (ch == ']')
dst & lt& ltch & lt& ltarrow& lt& lt"corchete derecho "& lt& ltenter;
else if (ch == ', ')
dst & lt& ltch & lt& ltarrow& lt& lt"coma"& lt& ltenter;
else if (ch == '^')
dst & lt& ltch & lt& ltarrow& lt& lt"puntero" & lt& ltenter;
else if(ch == ';')
dst & lt& ltch & lt& ltarrow& lt& lt"punto y coma "& lt& ltenter;
else if (ch == ' (')
dst & lt& ltch & lt& ltarrow& lt& lt"corchete izquierdo" & lt& ltenter;
else if (ch == ')')
dst & lt& ltch & lt& ltarrow& lt& lt"corchete derecho"& lt& ltenter;
//Juicio
else if(ch == ' & lt ;')
{
ch = GetChar(src);
if(ch = = ' & gt;')
horario de verano & lt& lt"& lt>& lt& ltarrow& lt& lt"desigual"& lt& ltenter;
else if (ch == '= ')
dst & lt& lt"& lt= " & lt& ltArrow& lt& lt"Menor o igual a"& lt& ltEnter;
Otro
{ p>
dst & lt& lt& lt'& lt& ltarrow& lt& lt"less"& lt& ltenter;
Retraer(src);
}
}
//Juez>y> =
si no (ch == ' >)
{
ch = GetChar( src);
if (ch == '= ')
dst & lt& lt" & gt= " & lt& ltarrow& lt& lt"mayor o igual a"& lt&
ltEnter;
Otro
{
dst & lt& lt& gt'& lt& ltarrow& lt& lt" Mayor " & lt& ltEnter;
Retraer (src);
}
}
//Sentencia. y..
si no (ch == ' . ')
{
ch = GetChar(src);
si (ch == ' . ')
dst & lt& lt".."& lt& ltarrow& lt& lt"bind"& lt& ltenter;
Otro
{
dst & lt& lt'.'& lt& ltarrow& lt& lt"point" & lt& ltenter;
Retraer (src);
}
}
//Juez: y:=
else if (ch == ':')
{
ch = GetChar(src);
if (ch == '= ')
dst & lt& lt":= " & lt& lt flecha<<"distribución"<<enter; p>
otro
{
dst<<:'<<arrow<<"dos puntos "& lt& ltEnter;
Retraer(src);
}
}
}
int main(int argc, char* argv[])
{
String strSrc
//Soporte de línea de comando
if (argc == 1)
{
cout & lt& lt" Introduzca el nombre del archivo fuente PASCAL:";
getline(cin, str RC);
}
Otros
str src = argv[1];
//Abrir archivo
ifstream src(strsrc . c _ str());
if (src.fail() )
{
cerr & lt& lt" \ a no pudo abrir \ " " & lt& ltstrSrc & lt& lt"\"!"& lt& ltendl
Devuelve 1;
}
of stream dst(" result . txt ");
//Comienza a analizar
Y (! src.eof())
Analizador (src, dst);
//Completa el trabajo
dst close(); p>src . close();
cout & lt& lt"Escribe los resultados del análisis Result.txt. "& lt& ltendl
Devuelve 0;
}