/* <identificador> → #leer_id {, <identificador> #leer_id} */ void lista_identificadores(void) { struct reg_expr id_reg; identificador(&id_reg); leer_id(&id_reg); while(prox_token() == COMA) { match(COMA); identificador(&id_reg); leer_id(&id_reg); } }
/* * <sentencia> → * <identificador> := <expresión> #asignar ; | * leer ( <listaIdentificadores> ) ; | * escribir ( <listaExpresiones> ) ; */ void sentencia(void) { token tok = prox_token(); struct reg_expr id_reg, result_reg; switch(tok) { case ID: identificador(&id_reg); match(ASIGNACION); expresion(&result_reg); asignar(&id_reg, &result_reg); match(PUNTOYCOMA); break; case LEER: match(LEER); match(PARENIZQUIERDO); lista_identificadores(); match(PARENDERECHO); match(PUNTOYCOMA); break; case ESCRIBIR: match(ESCRIBIR); match(PARENIZQUIERDO); lista_expresiones(); match(PARENDERECHO); match(PUNTOYCOMA); break; default: error_sintactico(tok); return; } }
void primaria(reg_expr * reg) { /* <primaria> -> <identificador> * | CONSTANTE * | PARENIZQUIERDO <expresión> PARENDERECHO */ token tok = next_token(); switch (tok) { case ID: identificador(reg); break; case CONSTANTE: match(CONSTANTE); *reg = procesar_cte(); // #procesar_cte break; case PARENIZQUIERDO: match(PARENIZQUIERDO); expresion(reg); match(PARENDERECHO); break; default: syntax_error(tok, "PRIMARIA"); } }
void lista_identificadores(void){ // <listaIdentificadores> -> <identificador> {COMA <identificador>} reg_expr id; do { identificador(&id); leer_id(&id); // #leer_id } while(next_token() == COMA && (match(COMA), true)); }
type lexico(){ while(esp_blanco()); if(identificador()) return _id; else if(naturales()) return _nat; else if(octal()) return _oct; else if(eof()) return _eof; else if (hexadecimal()) return _hex; else if (parent_izq()) return _parent_izq; return _error; }
/* * <primaria> → * <identificador> | * CONSTANTE #procesar_cte | * (<expresión>) */ void primaria(struct reg_expr *preg) { token tok; tok = prox_token(); switch (tok) { case ID: identificador(preg); break; case CONSTANTE: match(CONSTANTE); *preg = procesar_cte(); break; case PARENIZQUIERDO: match(PARENIZQUIERDO); expresion(preg); match(PARENDERECHO); break; default: error_sintactico(tok); return; } }
void sentencia(void) { /* * <sentencia> -> <identificador> ASIGNACION <expresión> PUNTOYCOMA * | LEER PARENIZQUIERDO <listaIdentificadores> PARENDERECHO PUNTOYCOMA * | ESCRIBIR PARENIZQUIERDO <listaExpresiones> PARENDERECHO PUNTOYCOMA */ token tok = next_token(); reg_expr right_operand, left_operand; switch (tok) { case ID: identificador(&left_operand); match(ASIGNACION); expresion(&right_operand); asignar(&left_operand, &right_operand); // #asignar match(PUNTOYCOMA); break; case LEER: match(LEER); match(PARENIZQUIERDO); lista_identificadores(); match(PARENDERECHO); match(PUNTOYCOMA); break; case ESCRIBIR: match(ESCRIBIR); match(PARENIZQUIERDO); lista_expresiones(); match(PARENDERECHO); match(PUNTOYCOMA); break; default: syntax_error(tok, "SENTENCIA"); } }