编译原理第一次作业

词法分析器

%{
#include "btest.tab.h"
;
	int yylval;

%}

%%
"+"		{ return ADD; }
"-"		{return SUB;}
"*" 	{return MUL;}
"/" 	{return DIV; }
"|"		{return ABS; }
[0-9]+ 	{yylval=atoi(yytext); return NUMBER; }
\n		{return EOL; }
[ \t]	{ /*忽略空白字符*/ }
.		{ printf("Mystery character %s\n", yytext); }
%%

语法分析器

/*计算器的最简版本*/
%{
#include <stdio.h>
void yyerror();
int yylex();
void main();
%}

/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token EOL

%%
calclist: /*空规则*/		//从输人开头进行匹配
	| calclist exp EOL { printf("= %d\n", $2);}		//EOL代表-一个表达式的结束
	;

exp : factor {$$ = $1 ;}
	|exp ADD factor {$$=$1+$3;}
	|exp SUB factor {$$=$1-$3;}
	;

factor: term  {$$ = $1 ;}
	|factor MUL term {$$=$1*$3;}
	|factor DIV term {$$=$1/$3;}
	;
	
term: NUMBER {$$ = $1 ;}
	| ABS term {$$=$2>=0?$2:-$2;}
	;
%%

void main(int argc, char **argv)
{
	yyparse();
}
void yyerror(char *s)
{
	fprintf(stderr, "error:%s\n",s);
}

编译运行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值