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

📄 scan.l

📁 这是我自己实现的一个微小的编译程序,附可执行代码的虚拟机,是理解编译原理的绝好材料.
💻 L
字号:
/*author 谭添升
	南京大学计算机科学与技术系
	2006年5月20日
	edit by UltraEdit
*/

D			[0-9]
L			[a-zA-Z_]


%{
#include<stdio.h>
#include<ctype.h>
#include"y_tab.h"				/*此为Win下版本*/
#include"global.h"

int yylineno=1;

extern struct Symtable symtab[SYMTAB_LEN];
extern int sym_off;
extern int name_off;
extern char name[];

void strdump(char * str);
void count();
void comment();

%}


%%
"/*"			{comment();}
"int"			{return (INT);}
"real"			{return (REAL);}

"while"			{return (WHILE);}
"do"			{return (DO);}
"if"			{return (IF);}
"then"			{return (THEN);}
"else"			{return (ELSE);}
"fi"			{return (FI);}
"begin"			{return (BEGINS);}
"end"			{return (END);}
">"			{yylval.relop=RA;return(RelOP);}
">="			{yylval.relop=RAE;return(RelOP);}
"<"			{yylval.relop=RB;return(RelOP);}
"<="			{yylval.relop=RBE;return(RelOP);}
"=="			{yylval.relop=RE;return(RelOP);}
"or"			{return (OR);}
"xor"			{return (XOR);}
"and"			{return (AND);}
"not"			{return (NOT);}
":="			{return (ASSIGN);}
"var"			{return (VAR);}
"read"			{return (READ);}
"write"			{return (WRITE);}

{D}+			{yylval.ival = atoi(yytext);return (integerConst);}
{D}+"."{D}+		{yylval.dval = atof(yytext);return(realConst); }
{L}({L}|{D})*		{yylval.idname=name_off;strdump(yytext);return(identifier);}/*不在此加入符号表,因为可能在使用段中,不用定义*/
			/*赋于Lex的文字识别,放在前面的模式优先,所以要把标识符尽量放在后面*/
[":"";""+""*""/""("")""%"]	{return (yytext[0]);}
-			{return (yytext[0]);}				/*不知道为什么一定要把它单独拿出来而不能写在上一行,写在上一行,不能正确识别*/
\n			{count();}					/*逻辑EOF*/
.			{/*return (yytext[0]);*/}			/*catch-all 即截流器*/


%%


int yywrap()
{
	return(1);
}

void comment()
{
	char c, c1;

loop:
	while ((c = input()) != '*' && c != 0)
		;//putchar(c);

	if ((c1 = input()) != '/' && c != 0)
	{
		unput(c1);
		goto loop;
	}

	if (c != 0)
		;//putchar(c1);
}

void strdump(char * str)
{
	int i=0;
	while(str[i]!=NULL)
	{
		name[name_off++]=str[i++];
	}
	name[name_off++]=NULL;
}
void count()
{
	yylineno++;	
}

⌨️ 快捷键说明

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