小白说编译原理-5-变量支持计算器

本文介绍了一个支持变量的计算器实现,通过lex词法分析器、yacc语法分析器和符号表三个模块完成。词法分析器识别运算符、数字和标识符,符号表用于存储和查找标识符的值。yacc处理语法转换规则,支持变量的赋值和取值操作。提供源代码链接供下载和学习。
摘要由CSDN通过智能技术生成

前言

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

简介

本章依然专注于使用yacc实现计算器,主要的特点是给算术运算增加变量支持。

##模块拆分
它主要分为3个模块

  1. lex词法分析器
  2. yacc语法分析器
  3. 符号表

功能描述

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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值