blob: 86e20a2b7a166993e90140c57af940806049ffde [file] [log] [blame]
#include "scanner.h" /* Useful Macro Definitions */
#include <stdio.h>
#include <stdlib.h>
/* File I/O Variables and Functions in file stringIO.c */
extern char CH; /* current input character */
extern char *LEXEME; /* string read in since the last flush */
extern char *FRONT,*BACK; /* FRONT: pointer to current input character in
LEXEME.
BACK: pointer to the first input character in
LEXEME, in fact equal to LEXEME */
extern unsigned LEX_LEN; /* current size of LEXEME buffer. Will change. */
extern void FLUSH(); /* a function that sets LEXEME to null */
extern void GETCHR(); /* a function that gets the next character and
updates LEXEME,FRONT,and BACK appropriately */
extern void BACKUP(); /* a function that undoes the last not undone
GETCHR */
static EOF_FLAG = 1, ERROR_CNT = 0; /* End Of File Flag and ERROR CouNT */
static void GETSTR(void) /* read in a string from the input stream */
{
GETCHR();
if (CH == ' ') {
FLUSH();
GETCHR();
}
else {
ERROR_CNT ++;
printf("------------>ERROR: Expected a SPACE between Token Code and\n");
printf(" the string following it <--------\n");
}
while (CH != '\n' && CH != EOF) GETCHR();
if (CH == '\n')
BACKUP();
else
EOF_FLAG = 0;
}
int main(void)
{
int CODE; /* TOKEN CODE */
int I1,I2; /* temp storage */
double D1; /* temp storage */
/* intialization */
LEXEME = (char *) calloc(1+LEX_LEN,1);
FLUSH();
/* main */
while (EOF_FLAG) {
scanf("%d",&CODE);
if (!feof(stdin)) {
switch (CODE) {
case ERRORMSG_1:
GETSTR();
printf("Scanner ERROR: %s\n",LEXEME);
break;
case LINE_1:
scanf("%d",&I1);
printf("===================> LINE NUMBER: %d\n",I1);
break;
case ADDOP_1:
scanf("%d",&I1);
printf(" ADDOP: ");
switch (I1) {
case PLUS_1:
printf("+\n");
break;
case MINUS_1:
printf("-\n");
break;
case OR_1:
printf("OR\n");
break;
default: {
ERROR_CNT ++;
printf("---------->ERROR: Expected an ADDOP Found: %d\n",I1);
}
}
break;
case MULOP_1:
scanf("%d",&I1);
printf(" MULOP: ");
switch (I1) {
case TIMES_1:
printf("*\n");
break;
case SLASH_1:
printf("/\n");
break;
case AND_1:
printf("AND\n");
break;
case DIV_1:
printf("DIV\n");
break;
default: {
ERROR_CNT ++;
printf("---------->ERROR: Expected an MULOP Found: %d\n",I1);
}
}
break;
case RELOP_1:
scanf("%d",&I1);
printf(" RELOP: ");
switch (I1) {
case EQUAL_1:
printf("=\n");
break;
case NOTEQUAL_1:
printf("<>\n");
break;
case LESSTHANOREQUAL_1:
printf("<=\n");
break;
case LESSTHAN_1:
printf("<\n");
break;
case GREATERTHANOREQUAL_1:
printf(">=\n");
break;
case GREATERTHAN_1:
printf(">\n");
break;
default: {
ERROR_CNT ++;
printf("---------->ERROR: Expected an RELOP Found: %d\n",I1);
}
}
break;
case ASSIGN_1:
printf(" ASSIGN (:=) \n");
break;
case COLON_1:
printf(" COLON (:) \n");
break;
case DOTDOT_1:
printf(" DOTDOT (..) \n");
break;
case DOT_1:
printf(" DOT (.) \n");
break;
case INTEGER_NUMBER_1:
scanf("%d",&I1);
printf(" Integer: ");
if (I1 == ILLEGAL_1)
printf("illegal\n");
else
if (I1 == VALID_1) {
scanf("%d",&I2);
printf("%d\n",I2);
}
else {
ERROR_CNT ++;
printf("---------->ERROR: Expected a VALID/ILLEGAL Code \n");
printf(" found: %d\n",I1);
}
break;
case REAL_NUMBER_1:
scanf("%d",&I1);
printf(" Real: ");
if (I1 == ILLEGAL_1)
printf("illegal\n");
else
if (I1 == VALID_1) {
scanf("%lf",&D1);
printf("%g\n",D1);
}
else {
ERROR_CNT ++;
printf("---------->ERROR: Expected a VALID/ILLEGAL Code \n");
printf(" found: %d\n",I1);
}
break;
case PROGRAM_1:
printf(" PROGRAM \n");
break;
case VAR_1:
printf(" VAR \n");
break;
case INTEGER_1:
printf(" INTEGER (KEYWORD) \n");
break;
case REAL_1:
printf(" REAL (KEYWORD) \n");
break;
case ARRAY_1:
printf(" ARRAY \n");
break;
case OF_1:
printf(" OF \n");
break;
case PROCEDURE_1:
printf(" PROCEDURE \n");
break;
case FORWARD_1:
printf(" FORWARD \n");
break;
case FUNCTION_1:
printf(" FUNCTION \n");
break;
case BEGIN_1:
printf(" BEGIN \n");
break;
case END_1:
printf(" END \n");
break;
case READ_1:
printf(" READ \n");
break;
case WRITE_1:
printf(" WRITE \n");
break;
case WRITELN_1:
printf(" WRITELN \n");
break;
case IF_1:
printf(" IF \n");
break;
case THEN_1:
printf(" THEN \n");
break;
case ELSE_1:
printf(" ELSE \n");
break;
case WHILE_1:
printf(" WHILE \n");
break;
case DO_1:
printf(" DO \n");
break;
case NOT_1:
printf(" NOT \n");
break;
case ID_1:
printf(" Identifier: ");
GETSTR();
printf("%s\n",LEXEME);
break;
case LEFT_PAREN_1:
printf(" LEFT PAREN '(' \n");
break;
case RIGHT_PAREN_1:
printf(" RIGHT PAREN ')' \n");
break;
case LEFT_BRACKET_1:
printf(" LEFT BRACKET ([) \n");
break;
case RIGHT_BRACKET_1:
printf(" RIGHT BRACKET (]) \n");
break;
case COMMA_1:
printf(" COMMA (,) \n");
break;
case SEMICOLON_1:
printf(" SEMICOLON (;) \n");
break;
default:
ERROR_CNT ++;
printf("------------>ERROR: A Valid TOKEN Code is not the\n");
printf(" first item on the input line.");
printf(" <--------\n");
GETSTR();
}
GETCHR();
if (CH != '\n' && EOF_FLAG) {
ERROR_CNT ++;
printf("------------>ERROR: Expected a Newline Character <--------\n");
}
FLUSH();
}
else EOF_FLAG = 0;
} /* end while (EOF_FLAG) */
printf("EOF\n");
if (ERROR_CNT)
printf("****** %d format errors found in output of your scanner.\n",
ERROR_CNT);
exit(0);
return 0;
}