www.pudn.com > Micro.rar > Lex.cpp
#include "StdAfx.h" #include ".\lex.h" #include#include Lex::Lex(void) { } Lex::~Lex(void) { } extern FILE outfp; extern FILE infp; Word g_token; token current_token = UNDEFINE; bool matched = true; token scanner() { int in_char, c; clear_buffer(); if( feof(stdin) ) { fprintf(stderr, "eof stdin\n"); return SCANEOF; } while( (in_char = getchar()) != EOF ) { if( isspace(in_char) ) { continue; } else if( isalpha(in_char) ) { /* ID ::= LETTER | ID LETTER | ID DIGIT | ID UNDERSCORE */ buffer_char(in_char); for( c = getchar(); isalnum(c) || c == '_'; c = getchar() ) { buffer_char(c); } ungetc(c, stdin); return check_reserved(); } else if( isdigit(in_char) ) { /* INTLITERAL ::= DIGIT | INTLITERAL DIGIT */ buffer_char(in_char); for(c = getchar(); isdigit(c); c = getchar() ) { 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 == '*' ) { return MULOP; } else if( in_char == '/' ) { return DIVOP; } else if( in_char == ':' ) { /* looking for ":=" */ c = getchar(); if( c == '=' ) { return ASSIGNOP; } else { ungetc(c, stdin); lexical_error(in_char); } } else if( in_char == '-' ) { /* is it --, comment start */ c = getchar(); if( c == '-' ) { do { in_char = getchar(); } while( in_char != '\n' ); } else { ungetc(c, stdin); return MINUSOP; } //return LPAREN; ////////// ???????????????? } else { lexical_error(in_char); } } fprintf(stderr, "return SCANEOF\n"); return SCANEOF; } token check_reserved(void){ // read write begin end function char * read = "read"; char * write = "write"; char * begin = "begin"; char * end = "end"; char * function = "function"; if( g_token.buf[0] == 'r' ) { if( g_token.len != strlen(read) ) { return ID; } if( strncmp(read, g_token.buf, strlen(read) ) == 0 ) { return READ; } } else if( g_token.buf[0] == 'w' ) { if( g_token.len != strlen(write) ) { return ID; } if( strncmp(write, g_token.buf, strlen(write) ) == 0 ) { return WRITE; } } else if( g_token.buf[0] == 'b' ) { if( g_token.len != strlen(begin) ) { return ID; } if( strncmp(begin, g_token.buf, strlen(begin)) == 0 ) { return BEGIN; } } else if( g_token.buf[0] == 'e' ) { if( g_token.len != strlen(end) ) { return ID; } if( strncmp(end, g_token.buf, strlen(end) ) == 0 ) { return END; } } else if( g_token.buf[0] == 'f' ) { if( g_token.len != strlen(function) ) { return ID; } if( strncmp(function, g_token.buf, strlen(function) ) == 0 ) { return FUNCTION; } } return ID; } void buffer_char(int c) { if( g_token.len >= WORD_LEN ) { error("word too long"); } g_token.buf[g_token.len++] = c; } void clear_buffer(void){ for(int i = WORD_LEN-1; i > 0; i--) { g_token.buf[i] = 0; } g_token.len = 0; } void lexical_error(int c) { fprintf(stderr, "[ Lex-Error ] - %c is unexpected\n", c); exit(1); }