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

📄 tiger.lex

📁 针对“虎书”中的tiger语言写的词法分析器 实现了多重注释嵌套、字符串中特殊转义字符和文件结束等处理。 具体请参考Readme.txt
💻 LEX
字号:
%{
#include <string.h>
#include "util.h"
#include "tokens.h"
#include "errormsg.h"

#define MAX_STR_CONST 200

int charPos=1;
int end_comment=0;
int begin_comment=0;
char str[MAX_STR_CONST]={""};
int strsize,i;
char *temp,ch;

int yywrap(void)
{
 charPos=1;
 return 1;
}

void adjust(void)
{
 EM_tokPos=charPos;
 charPos+=yyleng;
}

%}
/* Lex Definitions: */
ID		[a-zA-Z][a-zA-Z0-9_]*
DIGITS	[0-9][0-9][0-9]

%Start COMMENT STR
%%
<INITIAL>array		{adjust(); return ARRAY;}
<INITIAL>if			{adjust(); return IF;}
<INITIAL>then		{adjust(); return THEN;}
<INITIAL>else		{adjust(); return ELSE;}
<INITIAL>while		{adjust(); return WHILE;}
<INITIAL>for		{adjust(); return FOR;}
<INITIAL>to			{adjust(); return TO;}
<INITIAL>do			{adjust(); return DO;}
<INITIAL>let		{adjust(); return LET;}
<INITIAL>in			{adjust(); return IN;}
<INITIAL>end		{adjust(); return END;}
<INITIAL>of			{adjust(); return OF;}
<INITIAL>break		{adjust(); return BREAK;}
<INITIAL>nil		{adjust(); return NIL;}
<INITIAL>function	{adjust(); return FUNCTION;}
<INITIAL>var		{adjust(); return VAR;}
<INITIAL>type		{adjust(); return TYPE;}
<INITIAL>","		{adjust(); return COMMA;}
<INITIAL>":"		{adjust(); return COLON;}
<INITIAL>";"		{adjust(); return SEMICOLON;}
<INITIAL>"("		{adjust(); return LPAREN;}
<INITIAL>")"		{adjust(); return RPAREN;}
<INITIAL>"["		{adjust(); return LBRACK;}
<INITIAL>"]"		{adjust(); return RBRACK;}
<INITIAL>"{"		{adjust(); return LBRACE;}
<INITIAL>"}"		{adjust(); return RBRACE;}
<INITIAL>"."		{adjust(); return DOT;}
<INITIAL>"+"		{adjust(); return PLUS;}
<INITIAL>"-"		{adjust(); return MINUS;}
<INITIAL>"*"		{adjust(); return TIMES;}
<INITIAL>"/"		{adjust(); return DIVIDE;}
<INITIAL>"="		{adjust(); return EQ;}
<INITIAL>"<>"		{adjust(); return NEQ;}
<INITIAL>"<"		{adjust(); return LT;}
<INITIAL>"<="		{adjust(); return LE;}
<INITIAL>">"		{adjust(); return GT;}
<INITIAL>">="		{adjust(); return GE;}
<INITIAL>"&"		{adjust(); return AND;}
<INITIAL>"|"		{adjust(); return OR;}
<INITIAL>":="		{adjust(); return ASSIGN;}
<INITIAL>" "		{adjust();continue;}
<INITIAL>\t			{adjust();continue;}
<INITIAL>\n			{adjust();EM_newline(); continue;}
<INITIAL>"/*"		{	
						/* 转向COMMENT */
						adjust();
						begin_comment=end_comment=0;
						begin_comment++;						
						BEGIN COMMENT;
					}
<INITIAL>{ID}		{adjust();yylval.sval=String(yytext);return ID;}
<INITIAL>[0-9]+		{adjust();yylval.ival=atoi(yytext);return INT;}
<INITIAL>"*/"		{adjust();EM_error(EM_tokPos,"注释嵌套错误");}
<INITIAL>\"			{adjust();str[0]='\0';BEGIN STR;}
<INITIAL>.			{adjust();EM_error(EM_tokPos,"非法字符");}
<INITIAL><<EOF>>	{adjust();yyterminate();}

<STR>\\n			{adjust();strcat(str,"\n");}
<STR>\\\\			{adjust();strcat(str,"\\");}
<STR>\\t			{adjust();strcat(str,"\t");}
<STR>\\\"			{adjust();strcat(str,"\"");}
<STR>\\{DIGITS}		{
						/* 转换字符串中形式为\ddd的转义字符 */
						adjust();
						ch=0;
						temp=yytext;
						temp++;
						for(i=0;i<3;i++)
						{
							ch=ch*10+*temp-'0';
							temp++;
						}
						strsize=strlen(str);
						str[strsize]=ch;
						str[strsize+1]='\0';
					}
<STR>\\[\t\n" "]+\\	{adjust();}
<STR>\\				{adjust();EM_error(EM_tokPos,"非法字符");}
<STR>\"				{adjust();yylval.sval=str;BEGIN INITIAL;return STRING;}
<STR><<EOF>>		{adjust();EM_error(EM_tokPos,"未中止的字符串");yyterminate();}
<STR>.				{adjust();strcat(str,yytext);}

<COMMENT>"/*"		{adjust();begin_comment++;}
<COMMENT>.			{adjust();continue;}
<COMMENT>"*/"		{
						adjust();
						end_comment++;
						if(end_comment==begin_comment)							
							BEGIN INITIAL;
					}
<COMMENT><<EOF>>	{adjust();EM_error(EM_tokPos,"未中止的注释");yyterminate();}

⌨️ 快捷键说明

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