📄 totac.lex
字号:
ALPHA [a-zA-Z_]
DIGIT [0-9]
ID {ALPHA}({ALPHA}|{DIGIT})*
BASICCHAR [^\'\"\n]
SLASHCHAR "\\"|\\\"|\\\'|\\n|\\{BASICCHAR}
NORMALCHAR {BASICCHAR}|{SLASHCHAR}
STRCHAR {NORMALCHAR}|\'
SINGLECHAR {NORMALCHAR}|\"
STRINGCONST \"{STRCHAR}*\"
CHARCONST \'{SINGLECHAR}\'
DECIMAL {DIGIT}+
HEXPREFIX 0x|0X
HEXDIGIT [a-fA-F]|{DIGIT}
HEX {HEXPREFIX}{HEXDIGIT}+
DOUBLECONST {DIGIT}+"."{DIGIT}*
COMMENT \/\/({NORMALCHAR}|\"|\')*
%x comment
%{
#include <cstdio>
#include "IDHash.cpp"
#include "toTAC.tab.c"
using namespace std;
int PROGRAM_LineNumber = 1;
%}
%%
"/*" BEGIN(comment);
<comment>[^*\n]* { }
<comment>"*"+[^*/\n]* { }
<comment>\n { PROGRAM_LineNumber ++; }
<comment>"*"+"/" BEGIN(INITIAL);
{COMMENT} { }
"if" { return IF; }
"else" { return ELSE; }
"for" { return FOR; }
"while" { return WHILE; }
"break" { return BREAK; }
"return" { return RETURN; }
"=" { return LET; }
"char" { return TYPECHAR; }
"int" { return TYPEINT; }
"void" { return TYPEVOID; }
"null" { return SYMNULL; }
"struct" { return STRUCT; }
"const" { return CONST; }
"bool" { return TYPEBOOL; }
"%readreg" { return READREG; }
"%writereg" { return WRITEREG; }
"%asm" { return ASM; }
"&" { return AND; }
"|" { return OR; }
"~" { return CALCNOT; }
"^" { return XOR; }
"<<" { return SHL; }
">>" { return SHR; }
"++" { return PPLUS; }
"--" { return MMINUS; }
"(" { return LPAREN; }
")" { return RPAREN; }
"," { return COMMA; }
"." { return DOT; }
";" { return SEMICOLON; }
"{" { return LBRACKET; }
"}" { return RBRACKET; }
"[" { return LSQUARE; }
"]" { return RSQUARE; }
"+" { return ADD; }
"-" { return MINUS; }
"*" { return MUL; }
"/" { return DIV; }
"%" { return MOD; }
"<" { return LES; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"==" { return EQL; }
"!=" { return NEQ; }
"&&" { return LOGICAND; }
"!" { return NOT; }
"||" { return LOGICOR; }
"true" { return TRUE; }
"false" { return FALSE; }
{ID} { yylval.intval = IDHash_ID2int(yytext); return IDENT; }
{HEX} { sscanf(yytext, "%x", &yylval.intval); return INT; }
{DECIMAL} { yylval.intval = atoi(yytext); return INT; }
{DOUBLECONST} { sscanf(yytext, "%lf", &yylval.dblval); return DOUBLE; }
{STRINGCONST} { yylval.str = yytext; return STRING; }
{CHARCONST} { if (yytext[1] != '\\') yylval.intval = yytext[1]; else if (yytext[2] == 'n') yylval.intval = 10; else if (yytext[2] == 't') yylval.intval = 9; else if (yytext[2] == '0') yylval.intval = 0; else if (yytext[2] == 'b') yylval.intval = 8; else if (yytext[2] == 'r') yylval.intval = 13; else yylval.intval = yytext[2]; return CHAR; }
\n { PROGRAM_LineNumber ++; }
[ \t] { }
. { return NIL; }
%%
int yywrap() { return 1; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -