📄 c_minus.lex
字号:
%{
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using std::vector;
#include "lex.h"
int InsertConst(); // 插入常量,返回常量指针
int Reserve(); // 查找保留字表,若是保留字则返回其代码否则返回0
int InsertID(); // 将标识符插入符号表
int yylval;
vector<char *> ctable;
vector<char *> vtable;
int charno = 0; // 统计字符数
int lineno = 0; // 统计行数
// 关键字
keyword keywords[]={
"auto", $AUTO,
"break", $BREAK,
"case", $CASE,
"char", $CHAR,
"const", $CONST,
"continue", $CONTINUE,
"default", $DEFAULT,
"do", $DO,
"double", $DOUBLE,
"else", $ELSE,
"enum", $ENUM,
"extern", $EXTERN,
"float", $FLOAT,
"for", $FOR,
"goto", $GOTO,
"if", $IF,
"int", $INT,
"long", $LONG,
"register", $REGISTER,
"return", $RETURN,
"short", $SHORT,
"signed", $SIGNED,
"sizeof", $SIZEOF,
"static", $STATIC,
"struct", $STRUCT,
"switch", $SWITCH,
"typedef", $TYPEDEF,
"union", $UNION,
"unsigned", $UNSIGNED,
"void", $VOID,
"volatile", $VOLATILE,
"while", $WHILE,
"NULL", $NULL,
0,0,
};
%}
chartype \'[^\n']*\'
string \"[^\n"]*\"
ws [ \t]+
dig [0-9]
sign [-+]
alpha [a-zA-Z]
name ({alpha}|[_])({alpha}|{dig}|[_])*
intnum {sign}?(({dig}+)|("0x"({dig}|[a-fA-F])+))[lL]?
floatnum {sign}?{dig}+\.?({dig}+)?([eE]?{sign}?{dig}+)?
%%
{ws} /*空格或TAB符号,skip*/
"//" { char c;
while ((c = yyinput()) != '\n')
if (c == EOF) return $END;
yyunput(c, yytext_ptr);
}
"/*" { /*注释,skip*/
int c;
while ((c = yyinput()) != 0)
{
if (c == '\n')
lineno++;
else if (c == '*')
{
if ((c = yyinput()) == '/')
break;
else
yyunput(c, yytext_ptr);
}
}
}
{chartype} {
sscanf(yytext, "%d", &yylval);
InsertConst();
return $CHARTYPE;
}
{intnum} {
sscanf(yytext, "%d", &yylval);
InsertConst();
return $INTNUM;
}
{floatnum} {
sscanf(yytext, "%d", &yylval);
InsertConst();
return $FLOATNUM;
}
{string} {
sscanf(yytext, "%d", &yylval);
InsertConst();
return $STRINGTYPE;
}
{name} {
yylval = Reserve();
if (yylval == 0)
{
yylval = InsertID();
return $ID;
}
return yylval;
}
"+" { return $ADD; }
"-" { return $SUB; }
"*" { return $MUL; }
"/" { return $DIV; }
"%" { return $MOD; }
"=" { return $ASSIGN; }
"==" { return $EQUAL; }
"<" { return $LT; }
"<=" { return $LE; }
">" { return $GT; }
">=" { return $GE; }
"!=" { return $NE; }
"++" { return $INC; }
"--" { return $DEC; }
"+=" { return $ADDA; }
"-=" { return $SUBA; }
"*=" { return $MULA; }
"/=" { return $DIVA; }
"%=" { return $MODA; }
"<<=" { return $LSHIFTA; }
">>=" { return $RSHIFTA; }
"&=" { return $BITANDA; }
"^=" { return $BITXORA; }
"|=" { return $BITORA; }
"!" { return $LOGICNOT; }
"&&" { return $LOGICAND; }
"||" { return $LOGICOR; }
"<<" { return $LSHIFT; }
">>" { return $RSHIFT; }
"~" { return $BITNOT; }
"|" { return $BITOR; }
"^" { return $BITXOR; }
"&" { return $BITAND; }
"->" { return $ARROWOP; }
"(" { return $LRBRACKET; }
")" { return $RRBRACKET; }
"{" { return $LBRACE; }
"}" { return $RBRACE; }
"[" { return $LSBRACKET; }
"]" { return $RSBRACKET; }
";" { return $SEMICOLON; }
"," { return $COMMA; }
":" { return $COLON; }
"?" { return $QUES; }
\n { lineno++;/*skip*/}
<<EOF>> { return $END;}
. { return $ERROR;}
%%
yywrap()
{
return 1;
}
int Reserve()
{
int i = 0;
while (keywords[i].code != 0)
{
if (strcmp(yytext,keywords[i].name) == 0)
return keywords[i].code;
i++;
}
return 0;
}
int InsertID()
{
int size = vtable.size();
for(int i = 0; i != size; ++i)
{
if (strcmp(yytext,vtable[i]) == 0)
return i;
}
char *name = new char[strlen(yytext+1)];
strcpy(name, yytext);
vtable.push_back(name);
return size+1;
}
int InsertConst()
{
int size = ctable.size();
for(int i = 0; i != size; ++i)
{
if (strcmp(yytext,ctable[i]) == 0)
return i;
}
char *name = new char[strlen(yytext+1)];
strcpy(name, yytext);
ctable.push_back(name);
return size+1;
}
void ClearTable()
{
ctable.clear();
vtable.clear();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -