前言
这个编译原理是一个系列,系列地址为: https://blog.csdn.net/lpstudy/article/category/937055
考虑到很多小伙伴咨询代码的问题,现把链接发出来:https://github.com/lpstudy/compile
这个链接里面具有这个系列所有的VS工程和代码,工程是按照系列中的一个教程环境配置6来配置的,不过lib我好像没有上传到github。
如果大家发现任何问题,可以在github或者csdn,我有空的时候完善一下,争取做到下载github工程即可跑。
简介
本章依然专注于使用yacc实现计算器,主要的特点是给算术运算增加变量支持。
##模块拆分
它主要分为3个模块
- lex词法分析器
- yacc语法分析器
- 符号表
功能描述
1. lex词法分析器
正规式的定义如下:
delim [ \t]
ws {delim}+
letter [a-zA-Z]
digit [0-9]
id {letter}({letter}|{digit})*
/* can support 12.34 */
number {digit}+(\.{digit}+)?
相当于是给一些经常使用的正则表达式起一个别名,然后利用别名即可以构造更复杂的正则表达式。例如id标示符是由letter以及digit的组合形成的,表示必须以字母开头,后面可以字母和数字的任意组合。
词法分析器的动作定义(转换规则)
{ws} {/* do nothing */}
"int" {print_token(INT, yytext); return INT;}
"double" {print_token(DOUBLE, yytext);}
"char" {print_token(CHAR, yytext);}
"+" {print_token(PLUS, yytext); return PLUS;}
"-" {print_token(MINUS, yytext); return MINUS;}
"*" {print_token(TIMES, yytext); return TIMES;}
"/" {print_token(OVER, yytext); return OVER;}
"(" {return LP;}
")" {return RP;}
"\n" {return EOL;}
"=" {return ASSIGN;}
{id} {
int p = sym_table.lookup(yytext);
if(p == -1){//not find
p = sym_table.insert(yytext);//insert the default value 0.0
}
yylval = p;//return the position
return