//============================================================================ // Name : practica2.cpp // Author : gerardooscarjt@gmail.com // Version : // Copyright : Your copyright notice // Description : Práctica 2 //============================================================================ //#include#include #include #include #include "Queue.h" using namespace std; char getNextChar() { return getc(stdin); } bool isDigit(char c) { return c>47 && c<58; } bool isLetter(char c) { return (c>96 && c<123) || (c>64 && c<91); } bool isOperator(char c) { return c == '+' || c == '=' || c == '-' || c == '/' || c == '\\' || c == '*' || c == '%'; } bool isPuntuation(char c) { return c == '(' || c == ')' || c == '\n'; } bool isBlank(char c) { return c == ' '; } bool getNextToken() { int number = 0; string identifier; int state = 1; char c; while (true) { c = getNextChar(); if (c != -1) { switch (state) { case 1: if (isDigit(c)) { number = c-48; state = 2; } else if (isLetter(c)) { // identifier = letra; state = 3; identifier.clear(); identifier.push_back(c); } else if (isBlank(c)) { // No hace nada :) } else if (isOperator(c)) { // Ya veremos que hace... state = 4; identifier.clear(); identifier.push_back(c); } else if (isPuntuation(c)) { if (c == '(') printf("Token puntuacion: p_open\n"); if (c == ')') printf("Token puntuacion: p_close\n"); if (c == '\n') printf("Token puntuacion: eol\n"); } else { // Lanzar error, caracter inesperado, esperaba dígito, letra, operador, puntuación o blanco. printf("Error: caracter inesperado, esperaba dígito, letra, operador, puntuación o blanco"); } break; case 2: if (isDigit(c)) { number *=10; number += (c-48); } else { ungetc((int)c, stdin); printf("Token numero: %d\n", number); return true; } break; case 3: if (isLetter(c) || isDigit(c)) { identifier.push_back(c); } else { ungetc((int)c, stdin); printf("Token identificador: %s\n", identifier.data()); return true; } break; case 4: if (isOperator(c)) { identifier.push_back(c); } else { ungetc((int)c, stdin); // comprobar en una lista si el operador existe printf("Token operador: %s\n", identifier.data()); return true; } } } else { printf("Token puntuacion: eof\n"); return false; } } } int main(int argc, char *argv[]){ /* for (int i=0; i < argc; i++) printf("%s \n", argv[i]); */ char valor; do { valor = getNextToken(); //printf("ascii %d\n", valor); } while (valor); return 0; }