注重版权,若要转载烦请附上作者和链接
作者:Joshua_yi
链接:https://blog.csdn.net/weixin_44984664/article/details/109655609
一、代码
%option noyywrap
%option yylineno
%top{
#include<map>
#include<fstream>
#include<string.h>
#include<iostream>
#include <iomanip>
using std::map;
std::ifstream input("./testin");
using std::cout;
}
%{
map<std::string,int> map_keyword;
map<std::string,int> map_id;
int i=0,j=0;
%}
KEYWORD "auto"|"break"|"continue"|"case"|"char"|"const"|"default"|"do"|"double"|"else"|"enum"|"extern"|"float"|"for"|"goto"|"if"|"int"|"long"|"register"|"return"|"short"|"signed"|"sizeof"|"static"|"struct"|"switch"|"typedef"|"union"|"unsigned"|"void"|"volatile"|"while"|"define"
DIGIT [0-9]
LETTER [a-zA-Z]
ID ({LETTER}|_)({LETTER}|_|{DIGIT})*
NUMBER [1-9]{DIGIT}*|0
OPT "+="|"-="|"*="|"/="|"+"|"-"|"*"|"/"|"<="|">="|"=="|"="|"<"|">"
LEFTPAREN "("
RIGHTPAREN ")"
LEFTBRACKET "["
RIGHTBRACKET "]"
LEFTBRACE "{"
RIGHTBRACE "}"
SEMICOLON ";"
COMMA ","
COLON ":"
SQU "'"
LINES "\n"
SPACE " "
linecommentbegin "//"
linecomment_element .
linecomment_end \n
commentbegin "/*"
commentelement .|\n
commentend "*/"
%x COMMENT
%x LINECOMMENT
%%
{KEYWORD} {
auto it=map_keyword.find(yytext);
if(it!=map_keyword.end()){
cout<<std::setw(20)<<"KEYWORDS"<<std::setw(20)<<yytext<<std::setw(20)<<it->second<<std::setw(20)<<yylineno<<std::endl;
}
else{
map_keyword[yytext]=i;
cout<<std::setw(20)<<"KEYWORDS"<<std::setw(20)<<yytext<<std::setw(20)<<i<<std::setw(20)<<yylineno<<std::endl;
i++;
}
}
{ID} {
auto iter=map_id.find(yytext);
if(iter!=map_id.end()){
cout<<std::setw(20)<<"ID"<<std::setw(20)<<yytext<<std::setw(20)<<iter->second<<std::setw(20)<<yylineno<<std::endl;
}
else{
map_id[yytext]=j;
cout<<std::setw(20)<<"ID"<<std::setw(20)<<yytext<<std::setw(20)<<j<<std::setw(20)<<yylineno<<std::endl;
j++;
}
}
{LEFTPAREN} {cout<<std::setw(20)<<"LEFTPAREN"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{RIGHTPAREN} {cout<<std::setw(20)<<"RIGHTPAREN"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{LEFTBRACKET} {cout<<std::setw(20)<<"LEFTBRACKET"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{RIGHTBRACKET} {cout<<std::setw(20)<<"RIGHTBRACKET"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{LEFTBRACE} {cout<<std::setw(20)<<"LEFTBRACE"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{RIGHTBRACE} {cout<<std::setw(20)<<"RIGHTBRACE"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{SEMICOLON} {cout<<std::setw(20)<<"SEMICOLON"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{COMMA} {cout<<std::setw(20)<<"COMMA"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{COLON} {cout<<std::setw(20)<<"COLON"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{SQU} {cout<<std::setw(20)<<"SQU"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{NUMBER} {cout<<std::setw(20)<<"NUMBER"<<std::setw(20)<<yytext<<std::setw(20)<<yytext<<std::setw(20)<<yylineno<<std::endl;}
{OPT} {cout<<std::setw(20)<<"OPT"<<std::setw(20)<<yytext<<std::setw(20)<<' '<<std::setw(20)<<yylineno<<std::endl;}
{LINES} {}
{SPACE} {}
{linecommentbegin} {BEGIN LINECOMMENT;}
<LINECOMMENT>{linecomment_element} {}
<LINECOMMENT>{linecomment_end} {BEGIN INITIAL;}
{commentbegin} {BEGIN COMMENT;}
<COMMENT>{commentelement} {}
<COMMENT>{commentend} {BEGIN INITIAL;}
%%
int main()
{
yyFlexLexer lexer(&input);
lexer.yylex();
return 0;
}
二、makefile
lcc:
flex -+ sysycc.l
g++ lex.yy.cc -o lcc.out
./lcc.out
三、testin
/**I'm a function*/
int f() {
int a;
a = 0;
while(a < 10){
a *= 2;
}
return a;
}
int main(){
int a;
a = 0;
if(a==0) {
int a;
a=a+1;
}
// Comment line
return 0;
}