小白说编译原理-4-计算器yacc

前言

这个编译原理是一个系列,系列地址为: https://blog.csdn.net/lpstudy/article/category/937055
考虑到很多小伙伴咨询代码的问题,现把链接发出来:https://github.com/lpstudy/compile
这个链接里面具有这个系列所有的VS工程和代码,工程是按照系列中的一个教程环境配置6来配置的,不过lib我好像没有上传到github。
如果大家发现任何问题,可以在github或者csdn,我有空的时候完善一下,争取做到下载github工程即可跑。

前提说明

上一节通过一个yacc代码示例,说明一个简单计算器的编写。 它支持浮点数的±*/运算,以及括号,对空格也可以很好的识别。
#本节准备的工作
依据编译原理中简单编译器的代码,实现一个上述的编译器。 它不同于yacc代码的自动生成,它纯粹手写,实现了语法规则。我以前并不了解这种代码的编写,不知道如何根据规则来实现相应的代码,这次经同实验室的余同学提醒,说是这种机制很容易实现,叫做递归下降法。

要实现的语法规则

lines : lines expr '\n' {printf("%f\n", $2);}
	  | lines '\n'
	  |//empty line
	  ;

expr : expr '+' term {$$ = $1 + $3;}	
        | expr '-' term {$$ = $1 - $3;}	
        | term
        ;
term : term '*' factor {$$ = $1 * $3;}    
        | term '/' factor {$$ = $1 / $3;}        
        | factor {$$=$1;}
        ;
factor : '(' expr ')'   {$$=$2;}        
         | NUMBER
         ;   

规则说明

1,如上面所示,非常容易理解,支持多行,每行一次运算。打算按照龙书中的描述,实现词法分析,语法规则,符号表。
2,附加功能,既然实现了符号表,那变量的存储就成为可能,可以支持变量的定义,例如可以输入x=2,那么变量x就被解析为2. 然后可以使用x10+2这样的表达。
3,附加功能,不能只支持±
/,还可以支持%, ^, 开根号,以及可能的后续扩展

第一节,简单算术运算的实现

第二节,支持变量的算术运算的实现

第三节,支持额外的数学运算符的实现

本人lpstudy 转载请注明出处:http://blog.csdn.net/lpstudy/article/details/51226045

你可能感兴趣的:(编译原理)