/*returns next token from source file*/ token scanner() { char c; clear_buffer(); while(TRUE) { c = getc(fin); if(c == EOF) return SCANEOF; else if(isspace(c)) { if (c == '\n') line_num = line_num + 1; } else if (isalpha(c)) { buffer_char (c); c = getc (fin); while (isalnum(c) || c == '_') { buffer_char(c); c = getc(fin); } ungetc(c, fin); return check_reserved(); } else if (isdigit(c)) { buffer_char(c); c = getc(fin); while(isdigit(c)) { buffer_char(c); c = getc(fin); } ungetc(c,fin); return INTLITERAL; } else if (c == '(') return LPAREN; else if (c == ')') return RPAREN; else if (c == '{') return LCURL; else if (c == '}') return RCURL; else if (c == ',') return COMMA; else if (c == ';') return SEMICOLON; else if (c == '+') return PLUSOP; else if (c == '-') return MINUSOP; else if (c == '*') return MULTOP; else if (c == '/') { c = getc(fin); if(c == '/') { do c = getc(fin); while (c != '\n'); line_num = line_num + 1; } else { ungetc(c, fin); return DIVOP; } } else if (c == '=') { c = getc(fin); if(c == '=') { return EQUALS; } else { ungetc(c, fin); lexical_error(); } } else if (c == '!') { c = getc(fin); if(c == '=') { return NOTEQ; } else { ungetc(c, fin); lexical_error(); } } else if (c == '<') { c = getc(fin); if(c == '=') { return LESSEQ; } else { ungetc(c, fin); return LESS; } } else if (c == '>') { c = getc(fin); if(c == '=') { return GREATEQ; } else { ungetc(c, fin); return GREATER; } } else if (c == ':') { c = getc(fin); if(c == '=') return ASSIGNOP; else { ungetc(c, fin); lexical_error(); } } else lexical_error(); } }
token scanner(void) { int in_char,c; clear_buffer(); if (feof(archivo)) return SCANEOF; while (feof(archivo)==0){ in_char=fgetc(archivo); if (isspace(in_char)) continue; /*do nothing */ else if (isalpha(in_char)){ /* ID::=LETTER | ID LETTER | ID DIGIT | ID UNDERSCORE */ buffer_char(in_char); for (c= fgetc(archivo);isalnum(c)||c=='-';c=fgetc(archivo)) buffer_char(c); //ungetc(c,stdin); return check_reserved(); }else if (isdigit(in_char)){ /* INTLITERAL :: = DIGIT | INTLITERAL DIGIT */ buffer_char(in_char); for (c=fgetc(archivo);isdigit(c);c=fgetc(archivo)) buffer_char(c); //ungetc(c,stdin); return INTLITERAL; }else if (in_char== '(') return LPAREN; else if (in_char==')') return RPAREN; else if (in_char==';') return SEMICOLON ; else if (in_char==',') return COMMA ; else if (in_char=='+') return PLUSOP; else if (in_char==':'){ /*looking for ":="*/ c=fgetc(archivo); if (c=='=') return ASSIGNOP ; else{ //ungetc(c,stdin); lexical_error(in_char); } } else if (in_char=='-'){ /*is it --;comment start */ c=fgetc(archivo); if (c=='-'){ do in_char=fgetc(archivo); while (in_char!='\n'); } else{ //ungetc(c,stdin); return MINUSOP; } }else lexical_error(in_char); } }