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