⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lex.cpp

📁 现代编译原理C语言实现中的第二章的编译器实现。并在书中的基础上有所改变。包括词法语法分析及汇编代码生成。
💻 CPP
字号:
#include "StdAfx.h"
#include ".\lex.h"
#include <stdio.h>
#include <ctype.h>


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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -