编译原理实验三 语义分析程序设计与实现

一、实验目的

在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成相关语义分析器的代码开发。

二、基本实验内容及要求

对文法 G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。
输入:包含测试用例(由标识符、无符号数和+、−、*、/、(、)构成的算术表达式)的源程序文件。
输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。若源程序中有错误,应指出错误信息。
要求:
1、结合实验一和实验二中的相关内容,完成语法制导翻译的程序设计。
2、对完成的编译系统进行全面测试,供测试的例子应包括符合语义规则的语句,以及分析程序能够判别的若干错例,并给出执行结果。

四、源程序

#include <iostream>
#include <string>
#include <iomanip>
#include <cstring>
#include <fstream>
#include <stdio.h>
#include <cassert>
#include <vector>
//#define _CRT_SECURE_NO_DEPRECATE
//#define _CRT_SECURE_NO_WARNINGS
using namespace std;
/*
begin	BEGIN	1
end		END		2
if		IF		3
then	THEN	4
else	ELSE	5
while	WHILE	6
do		DO		7
标识符	ID		8
浮点常数UCON	9
<		LT		10
<=		LE		11
==		EQ		12
<>		NE		13
>		GT		14
>=		GE		15
=		IS		16
+		PL		17
-		MI		18
*		MU		19
/		DI		20
(		LP		21
)		RP		22
*/

//词法分析部分
const char* table1[] = {
    " ","begin","end","if","then","else","while","do" };
const char* table2[] = {
    " ","BEGIN","END","IF","THEN","ELSE","WHILE","DO","ID","UCON","LT","LE","EQ","NE","GT","GE","IS","PL","MI","MU","DI","LP","RP" };
char TOKEN[20];//用来依次存放一个单词词文中的各个字符。
char str[50];//词法分析后的带有i的表达式
int len = 0;
//语法分析部分
string action[16][8] = {
    {
   "s4","null","null" ,"null" ,"null","null","s5" , "null" },
					{
   "null","null","s6","s7","null","null","null","acc"},
					{
   "null","r3","r3","r3","s8","s9","null","r3"} ,
					{
   "null","r6","r6","r6","r6","r6","null","r6"},
					{
   "s4","null","null","null","null","null","s5","null"},
					{
   "null","r8","r8","r8","r8","r8","null","r8"},
					{
   "s4","null","null","null","null","null","s5","null"},
					{
   "s4","null","null","null","null","null","s5","null"},
					{
   "s4","null","null","null","null","null","s5","null"},
					{
   "s4","null","null","null","null","null","s5","null"},
					{
   "null","s15","s6","s7","null","null","null","null"} ,
					{
   "null","r1","r1","r1","s8","s9","null","r1"},
					{
   "null","r2","r2","r2","s8","s9","null","r2"} ,
					{
   "null","r4","r4","r4","r4","r4","null","r4"} ,
					{
   "null","r5","r5","r5","r5","r5","null","r5"} ,
					{
   "null","r7","r7","r7","r7","r7","null","r7"} };
int go[16][3] = {
    {
   1 , 2 , 3 },
				{
    -1 , -1 , -1 },
				{
    -1 , -1 , -1 } ,
				{
    -1 , -1 , -1 },
				{
    10 , 2 , 3 },
				{
    -1 , -1 , -1 },
				{
    -1 , 11 , 3 },
				{
    -1 , 12 , 3 },
				{
    -1 , -1 , 13 },
				{
    -1 , 
  • 15
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值