📄 scan.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 + -