在我的另外两篇文章中介绍了语法分析树建立的Java实现,这次使用flex和bison在Unix环境下完成语法分析树的建立关于flex和bison的使用和语法在这里就不详细的介绍了。
如果你的Unix环境没有装这两个工具可以使用如下命令进行安装(机器需要连接网)
sudo apt-get install bison
sudo apt-get install flex
按照提示属于“y”即可完成安装
parser.lex
%{
#include "parser.tab.h"
#include "tree.h"
#include <string.h>
int line=1;
int tempTag;
int getTag(char *);
%}
DIGIT [0-9]
LETTER [A-Za-z]
SPACE \ |\t
LINE \n
NUM {DIGIT}+
ID {LETTER}({LETTER}|{DIGIT})*
%%
{LINE} {line++;}
{SPACE} {}
[=] {yylval=createLeaf(SET,yytext); return SET;}
[!] {yylval=createLeaf(NOT,yytext); return NOT;}
[+] {yylval=createLeaf(ADD,yytext); return ADD;}
[-] {yylval=createLeaf(SUB,yytext); return SUB;}
[*] {yylval=createLeaf(MUL,yytext); return MUL;}
[/] {yylval=createLeaf(DIV,yytext); return DIV;}
[>] {yylval=createLeaf(GT,yytext); return GT;}
[<] {yylval=createLeaf(LT,yytext); return LT;}
[>][=] {yylval=createLeaf(GE,yytext); return GE;}
[<][=] {yylval=createLeaf(LE,yytext); return LE;}
[=][=] {yylval=createLeaf(EQ,yytext); return EQ;}
[!][=] {yylval=createLeaf(NE,yytext); return NE;}
[&][&] {yylval=createLeaf(AND,yytext); return AND;}
[|][|] {yylval=createLeaf(OR,yytext); return OR;}
[;] {yylval=createLeaf(SC,yytext); return SC;}
[(] {yylval=createLeaf(LP,yytext); return LP;}
[)] {yylval=createLeaf(RP,yytext); return RP;}
[{] {yylval=createLeaf(LB,yytext); return LB;}
[}] {yylval=createLeaf(RB,yytext); return RB;}
\[ {yylval=createLeaf(LSB,yytext); return LSB;}
\] {yylval=createLeaf(RSB,yytext); return RSB;}
{NUM} {
yylval=createLeaf(NUM,yytext);
return NUM;
}
{ID} {
tempTag=getTag(yytext);
yylval=createLeaf(temp