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

📄 c_minus.lex

📁 利用flex写的C_minus的词法分析器
💻 LEX
字号:
%{
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

#include <vector>
using std::vector;
#include "lex.h"

int InsertConst();	// 插入常量,返回常量指针
int Reserve();		// 查找保留字表,若是保留字则返回其代码否则返回0
int InsertID();		// 将标识符插入符号表

int yylval;
vector<char *> ctable;
vector<char *> vtable;      

int charno = 0;		// 统计字符数
int lineno = 0;		// 统计行数

// 关键字
keyword keywords[]={
	"auto", $AUTO,
	"break", $BREAK,
	"case", $CASE,
	"char", $CHAR,
	"const", $CONST,
	"continue", $CONTINUE,
	"default", $DEFAULT,
	"do", $DO,
	"double", $DOUBLE,
	"else", $ELSE,
	"enum", $ENUM,
	"extern", $EXTERN,
	"float", $FLOAT,
	"for", $FOR,
	"goto", $GOTO,
	"if", $IF,
	"int", $INT,
	"long", $LONG,
	"register", $REGISTER,
	"return", $RETURN,
	"short", $SHORT,
	"signed", $SIGNED,
	"sizeof", $SIZEOF,
	"static", $STATIC,
	"struct", $STRUCT,
	"switch", $SWITCH,
	"typedef", $TYPEDEF,
	"union", $UNION,
	"unsigned", $UNSIGNED,
	"void", $VOID,
	"volatile", $VOLATILE,
	"while", $WHILE,
	"NULL", $NULL,
	0,0,
};
%}
chartype \'[^\n']*\'
string \"[^\n"]*\"
ws [ \t]+
dig [0-9]
sign [-+]
alpha [a-zA-Z]
name ({alpha}|[_])({alpha}|{dig}|[_])*
intnum {sign}?(({dig}+)|("0x"({dig}|[a-fA-F])+))[lL]?
floatnum {sign}?{dig}+\.?({dig}+)?([eE]?{sign}?{dig}+)?
%%
{ws}	/*空格或TAB符号,skip*/
"//"	{	char c;
			while ((c = yyinput()) != '\n')
			if (c == EOF) return $END;
			yyunput(c, yytext_ptr);
		}
"/*" {	/*注释,skip*/
		int c;
		while ((c = yyinput()) != 0)
		{
			if (c == '\n')
				lineno++;
			else if (c == '*')
			{
				if ((c = yyinput()) == '/')
					break;
				else
					yyunput(c, yytext_ptr);
			}
		}
	}	
{chartype}	{
		sscanf(yytext, "%d", &yylval);
		InsertConst();
		return $CHARTYPE;
	}
{intnum}	{
		sscanf(yytext, "%d", &yylval);
		InsertConst();
		return $INTNUM;
	}
{floatnum}   {
		sscanf(yytext, "%d", &yylval);
		InsertConst();
		return $FLOATNUM;
	}
{string}	{
		sscanf(yytext, "%d", &yylval);
		InsertConst();
		return $STRINGTYPE;
	}
{name} { 
		yylval = Reserve();
		if (yylval == 0)
		{
			yylval = InsertID();
			return $ID;
		}
		return yylval;
	}

"+" { return $ADD; }
"-" { return $SUB; }
"*" { return $MUL; }
"/" { return $DIV; }
"%" { return $MOD; }
"=" { return $ASSIGN; }
"==" { return $EQUAL; }
"<" { return $LT; }
"<=" { return $LE; }
">" { return $GT; }
">=" { return $GE; }
"!=" { return $NE; }
"++" { return $INC; }
"--" { return $DEC; }
"+=" { return $ADDA; }
"-=" { return $SUBA; }
"*=" { return $MULA; }
"/=" { return $DIVA; }
"%=" { return $MODA; }
"<<=" { return $LSHIFTA; }
">>=" { return $RSHIFTA; }
"&=" { return $BITANDA; }
"^=" { return $BITXORA; }
"|=" { return $BITORA; }
"!" { return $LOGICNOT; }
"&&" { return $LOGICAND; }
"||" { return $LOGICOR; }
"<<" { return $LSHIFT; }
">>" { return $RSHIFT; }
"~" { return $BITNOT; }
"|" { return $BITOR; }
"^" { return $BITXOR; }
"&" { return $BITAND; }
"->" { return $ARROWOP; }
"(" { return $LRBRACKET; }
")" { return $RRBRACKET; }
"{" { return $LBRACE; }
"}" { return $RBRACE; }
"[" { return $LSBRACKET; }
"]" { return $RSBRACKET; }
";" { return $SEMICOLON; }
"," { return $COMMA; }
":" { return $COLON; }
"?" { return $QUES; }
\n	{ lineno++;/*skip*/}
<<EOF>> { return $END;}
.	{ return $ERROR;}
%%
yywrap()
{
	return 1;
}

int Reserve()
{
	int i = 0;
	while (keywords[i].code != 0)
	{
		if (strcmp(yytext,keywords[i].name) == 0)
			return keywords[i].code;
		i++;
	}
	return 0;
}

int InsertID()
{
	int size = vtable.size();
	for(int i = 0; i != size; ++i)
	{
		if (strcmp(yytext,vtable[i]) == 0)
			return i;
	}
	char *name = new char[strlen(yytext+1)];
	strcpy(name, yytext);
	vtable.push_back(name);
	return size+1;
}

int InsertConst()
{
	int size = ctable.size();
	for(int i = 0; i != size; ++i)
	{
		if (strcmp(yytext,ctable[i]) == 0)
			return i;
	}
	char *name = new char[strlen(yytext+1)];
	strcpy(name, yytext);
	ctable.push_back(name);
	return size+1;
}

void ClearTable()
{
	ctable.clear();
	vtable.clear();
}

⌨️ 快捷键说明

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