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

📄 lex.l

📁 一个编译器修改的例子
💻 L
字号:
%{#include "grammar.tab.h"#include "error.h"#include "io.h"#include "lex.h"#include "salloc.h"#include "token.h"#define MAX_INCLUDE_DEPTH 32unsigned		current_line	= 1;static unsigned		comment_level	= 0, comment_start;static unsigned		include_level	= 0;static struct{    unsigned		current_line;    const char		*current_file;    YY_BUFFER_STATE	buffer_state;}include_stack [MAX_INCLUDE_DEPTH];static void	new_input();#if defined __GNUC__ /* prevent some compiler warnings */#if !(defined __OpenBSD__ || defined __FreeBSD__) /* fix compile error on OpenBSD */extern int	fileno(FILE *);#endifstatic void	yyunput(int c, register char *yy_bp) __attribute__((unused));#endif%}IDENTIFIER	[A-Za-z_][A-Za-z_0-9]*DEC_CONST	[1-9][0-9]*HEX_CONST	0[Xx][0-9A-Fa-f]+OCT_CONST	0[0-7]*INTEGER_CONST	{DEC_CONST}|{HEX_CONST}|{OCT_CONST}FINT		[0-9]+FRAC		\.{FINT}EXP		[Ee][+-]?{FINT}REAL_CONST	{FINT}?{FRAC}{EXP}?|{FINT}(\.|{EXP})NON_ESCAPED	[^\\\n\'\"]ESCAPED		[ntvbrfa\\\?\'\"]|[0-7]+|x[0-9A-Fa-f]+CHAR_SYMBOL	{NON_ESCAPED}|\\{ESCAPED}CHAR_CONST	\'({CHAR_SYMBOL}|\")\'CHAR_CONST_ERR	\'({CHAR_SYMBOL}|\")*\'STRING_CONST	\"({CHAR_SYMBOL}|\')*\"RECORD		IDENTIFIER%x		COMMENT%x		INCLUDE%%[ \t\r]+\n		++ current_line;"(*"		comment_level = 1; comment_start = current_line; BEGIN(COMMENT);<COMMENT>{    "(*"	++ comment_level;    "*)"	if (-- comment_level == 0) BEGIN(INITIAL);    "\n"	++ current_line;    <<EOF>>	{ error(0, "unterminated comment starting at line %u",			comment_start); return 0; }    .}^include	BEGIN(INCLUDE);<INCLUDE>{    [ \t]+    [^ \t\n\r]+	new_input();}":="		return ASSIGNMENT;">="		yylval.token = new_token(); return GREATER_EQUAL;"<>"		yylval.token = new_token(); return NOT_EQUAL;"<="		yylval.token = new_token(); return SMALLER_EQUAL;"and"		yylval.token = new_token(); return AND;"array"		return ARRAY;"begin"		return _BEGIN;"bool"		return BOOL;"by"		return BY;"char"		return CHAR;"delete"	return DELETE;"do"		return DO;"else"		return ELSE;"end"		return END;"false"		yylval.token = new_token(); return FALSE;"for"		return FOR;"function"	return FUNCTION;"if"		return IF;"int"		return INT;"is"		return IS;"new"		yylval.token = new_token(); return NEW;"not"		yylval.token = new_token(); return NOT;"null"		yylval.token = new_token(); return __NULL;"of"		return OF;"or"		yylval.token = new_token(); return OR;"procedure"	return PROCEDURE;"real"		return REAL;"repeat"	return REPEAT;"return"	yylval.token = new_token(); return RETURN;"size"		yylval.token = new_token(); return SIZE;"string"	return STRING;"then"		return THEN;"to"		return TO;"true"		yylval.token = new_token(); return TRUE;"until"		return UNTIL;"var"		return VAR;"while"		return WHILE;"record"	return RECORD;{CHAR_CONST}	yylval.token = new_token(); return CHAR_CONSTANT;{CHAR_CONST_ERR}  yylval.token = new_token(); error(yylval.token, "invalid character constant %s", yytext); return CHAR_CONSTANT;{IDENTIFIER}	yylval.token = new_token(); return IDENTIFIER;{INTEGER_CONST}	yylval.token = new_token(); return INTEGER_CONSTANT;{REAL_CONST}	yylval.token = new_token(); return REAL_CONSTANT;{STRING_CONST}	yylval.token = new_token(); return STRING_CONSTANT;[\+\-\*\%\/\<\>\=\[.]	yylval.token = new_token(); return *yytext;.		return * (unsigned char *) yytext;%%int yywrap(void){    if (include_level == 0)	return 1;    yy_delete_buffer(YY_CURRENT_BUFFER);    free((char *) input_file_name);    -- include_level;    yy_switch_to_buffer(include_stack [include_level].buffer_state);    current_line      = include_stack [include_level].current_line;    input_file_name   = include_stack [include_level].current_file;    return 0;}static void try_search_path(){    int i;    for (i = 0; i < list_size(search_path); i ++)    {	char path [1024];	sprintf(path, "%s/%s", (char *) list_index(search_path, i), yytext);	if ((yyin = fopen(path, "r")) != 0)	    return;    }    error(0, "cannot open %s", yytext);    exit(1);}static void new_input(){    if (include_level == MAX_INCLUDE_DEPTH)    {	error(0, "includes nested too deeply");	exit(1);    }    include_stack [include_level].buffer_state = YY_CURRENT_BUFFER;    include_stack [include_level].current_line = current_line;    include_stack [include_level].current_file = input_file_name;    ++ include_level;    try_search_path();    input_file_name = safe_strdup(yytext);    current_line = 1;    yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));    BEGIN(INITIAL);}

⌨️ 快捷键说明

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