一、实验目的
在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成相关语义分析器的代码开发。
二、基本实验内容及要求
对文法 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 ,