学院(系)名称:计算机通信工程学院
姓名
学号
专业
班级
实验项目
实验三:语义分析中间代码生成
课程名称
编译原理
课程代码
实验时间
实验点
计算机软件实验室
计算机软件实验室
批改意见
成绩
教师签字:
实验容:
选择LL1分析法算符优先分析法LR分析法实现表达式文法语法制导翻译程文法G[E]示:
E→E+T | ET | T
T→T*F | TF | F
F→P^F | P
P→(E) | i
求构造出符合语义分析求属性文法描述完成实验二(语法分析)基础进行语义分析程序设计终输出测试例等价四元式中间代码序列
实验目:
1.掌握语法制导翻译基功
2.巩固语义分析基功原理认识
3.够基语法制导翻译知识进行语义分析
4.掌握类高级语言中基语句应语义动作
5.理解处理语义分析中异常错误
实验求:
1.实验二基础实现语法制导翻译功输出翻译四元式序列
2.求详细描述选分析方法进行制导翻译设计程
3.完成设计分析器功测试出测试数实验结果
4.增加程序读性请程序中进行适注释说明
5.整理机步骤总结验体会
6.认真完成时提交实验报告
实验程记录(源程序测试例测试结果心体会等)
#include
#include
#define size 1024
using namespace std
int step0
typedef struct variable_T
{
char operate操作符
string var1变量 1
string var2变量 2
int num第变量
}variable_T
variable_T t[size]记录四元式变量变量
int tsize1表示第tsize+1变量
typedef struct char_stack
{
char content前字符
string endchar符号代表中间变量 i t1 t2 等等
int num该字符相关中间变量序号
}char_stack
string table[19][13]{ + * ^ ) # ( i E T F P
* 0 * errerrerrerrerrerrerr s5 s6 1 2 3 4
* 1 * s7 s8errerrerrerraccerrerrerrerrerrerr
* 2 * r3 r3 s9s10err r3 r3errerrerrerrerrerr
* 3 * r6 r6 r6 r6err r6 r6errerrerrerrerrerr
* 4 * r8 r8 r8 r8s11 r8 r8errerrerrerrerrerr
* 5 * errerrerrerrerrerrerr s5 s6 c 2 3 4
* 6 * r10r10r10r10r10r10r10errerrerrerrerrerr
* 7 * errerrerrerrerrerrerr s5 s6err d 3 4
* 8 * errerrerrerrerrerrerr s5 s6err e 3 4
* 9 * errerrerrerrerrerrerr s5 s6errerr f 4
* 10* errerrerrerrerrerrerr s5 s6errerr g 4
* 11* errerrerrerrerrerrerr s5 s6errerr h 4
* 12* s7 s8errerrerrs18errerrerrerrerrerrerr
* 13* r1 r1 s9s10err r1 r1errerrerrerrerrerr
* 14* r2 r2 s9s10err r2 r2errerrerrerrerrerr
* 15* r4 r4 r4 r4err r4 r4errerrerrerrerrerr
* 16* r5 r5 r5 r5err r5 r5errerrerrerrerrerr
* 17* r7 r7 r7 r7err r7 r7errerrerrerrerrerr
* 18* r9 r9 r9 r9 r9 r9 r9errerrerrerrerrerr}
int getLength(char str[size])
{
int i0
while(str[i]'\0')
i++
return i
}
int getLengthc(char_stack str[size])
{
int i0
while(str[i]content'\0')
i++
return i
}
int getstringLength(string str)
{
int i0
while(str[i]'\0')
i++
return i
}
char gettop(char stack[size]int top)
{
if(stack[top]'\0')
return stack[top]
else
return '#'
}
void popstack(char *stackint *pointerint times)
{
int p
for(int i1i
p*pointer
stack[p]'\0'
(*pointer)
}
}
void popstackc(char_stack *stackint *pointerint times)
{
int p
for(int i1i
p*pointer
stack[p]content'\0'
(*pointer)
}
}
void pushstack(char_stack *stackint *pointerchar *stack_stateint *pointer_statechar strchar sxint x)
{
int i0
if(x0)
cout<<\t\t\t状态 <
cout<< 状态 <
{
cout<
stack[(*pointer)]contentstr
}
(*pointer_state)++
stack_state[(*pointer_state)]sx
}
int getcol(char top)
{
switch(top)
{
case '+'
return 0
case ''
return 1
case '*'
return 2
case ''
return 3
case '^'
return 4
case ')'
return 5
case '#'
return 6
case '('
return 7
case 'i'
return 8
case 'E'
return 9
case 'T'
return 10
case 'F'
return 11
case 'P'
return 12
default
cout<
}
}
int getraw(char raw)
{
switch(raw)
{
case '0'
return 0
case '1'
return 1
case '2'
return 2
case '3'
return 3
case '4'
return 4
case '5'
return 5
case '6'
return 6
case '7'
return 7
case '8'
return 8
case '9'
return 9
case 'a'
return 10
case 'b'
return 11
case 'c'
return 12
case 'd'
return 13
case 'e'
return 14
case 'f'
return 15
case 'g'
return 16
case 'h'
return 17
case 'i'
return 18
default
cout<
}
}
char getraw_content(string str)
{
if(str1)
return '1'
else if(str2)
return '2'
else if(str3)
return '3'
else if(str4)
return '4'
else if(strc)
return 'c'
else if(strd)
return 'd'
else if(stre)
return 'e'
else if(strf)
return 'f'
else if(strg)
return 'g'
else if(strh)
return 'h'
else if(stri)
return 'i'
}
string get_tx(int num)
{
switch(num)
{
case 1
return t1
case 2
return t2
case 3
return t3
case 4
return t4
case 5
return t5
case 6
return t6
case 7
return t7
case 8
return t8
case 9
return t9
case 10
return t10
case 11
return t11
case 12
return t12
case 13
return t13
case 14
return t14
case 15
return t15
case 16
return t16
程序暂时等时间编写合适数字转换字符串函数时更改函数
}
}
void show(char str[size]int index)
{
int lengthgetLength(str)
if(index1)
cout<<\t
for(int iindex+1i
void showc(char_stack str[size]int index)
{
int lengthgetLengthc(str)
if(index1)
cout<<\t
for(int iindex+1i
void switch_method(char_stack *stackint *pointerchar *state_stackint *pointer_statestring productionchar *strint *index)
{
step++
cout<<\n<
cout<<\t
showc(stack1)显示符号站
cout<<\t<
char cstr[(*index)]
if(productionerr)
{
cout<
}
else if(productions5)
{
char sx'5'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions6)
{
char sx'6'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions7)
{
char sx'7'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions8)
{
char sx'8'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions9)
{
char sx'9'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions10)
{
char sx'a'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions11)
{
char sx'b'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productions18)
{
char sx'i'
(*index)++
pushstack(stackpointerstate_stackpointer_statecsx0)
}
else if(productionr1)
{
int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
string ststack[po]endchar应 F
po2
string sestack[po]endchar规约前记录规约字符代表变量应 T
tsize++新增时变量
t[tsize]numtsize+1面四表达式面规约式进行赋值
t[tsize]operate'+'
t[tsize]var1se
t[tsize]var2st
cout<<\t(<
int p(*pointer_state)
p3
char secondstate_stack[p]
int igetraw(second)
int jgetcol('E')
char c_outgetraw_content(table[i][j])
cout<<\tr1E>E+T规约
popstack(state_stackpointer_state3)
popstackc(stackpointer3)
char c'E'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
string sget_tx(t[tsize]num)
stack[(*pointer)]endchars保存E+T规约结果变量保存前字符终结符
}
else if(productionr2)
{
int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
string ststack[po]endchar应 T
po2
string sestack[po]endchar规约前记录规约字符代表变量应 E
tsize++新增时变量
t[tsize]numtsize+1面四表达式面规约式进行赋值
t[tsize]operate''
t[tsize]var1se
t[tsize]var2st
cout<<\t(<
int p(*pointer_state)
p3
char secondstate_stack[p]
int igetraw(second)
int jgetcol('E')
char c_outgetraw_content(table[i][j])
cout<<\tr2E>ET规约
popstack(state_stackpointer_state3)
popstackc(stackpointer3)
char c'E'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
string sget_tx(t[tsize]num)
stack[(*pointer)]endchars保存ET规约结果变量保存前字符终结符
}
else if(productionr3)
{
string sstack[(*pointer)]endchar规约前记录规约字符代表变量
int p(*pointer_state)
p
char secondstate_stack[p]
int igetraw(second)
int jgetcol('E')
char c_outgetraw_content(table[i][j])
cout<<\t\t\tr3E>T规约
popstack(state_stackpointer_state1)
popstackc(stackpointer1)
char c'E'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
stack[(*pointer)]endchars记录变量赋值规约字符
}
else if(productionr4)
{
int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
string sfstack[po]endchar应 F
po2
string ststack[po]endchar规约前记录规约字符代表变量应 T
tsize++新增时变量
t[tsize]numtsize+1面四表达式面规约式进行赋值
t[tsize]operate'*'
t[tsize]var1st
t[tsize]var2sf
cout<<\t(<
int p(*pointer_state)
p3
char secondstate_stack[p]
int igetraw(second)
int jgetcol('T')
char c_outgetraw_content(table[i][j])
cout<<\tr4T>T*F规约
popstack(state_stackpointer_state3)
popstackc(stackpointer3)
char c'T'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
string sget_tx(t[tsize]num)
stack[(*pointer)]endchars保存T*F规约结果变量保存前字符终结符
}
else if(productionr5)
{
int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
string sfstack[po]endchar应 F
po2
string ststack[po]endchar规约前记录规约字符代表变量应 T
tsize++新增时变量
t[tsize]numtsize+1面四表达式面规约式进行赋值
t[tsize]operate''
t[tsize]var1st
t[tsize]var2sf
cout<<\t(<
int p(*pointer_state)
p3
char secondstate_stack[p]
int igetraw(second)
int jgetcol('T')
char c_outgetraw_content(table[i][j])
cout<<\tr5T>TF规约
popstack(state_stackpointer_state3)
popstackc(stackpointer3)
char c'T'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
string sget_tx(t[tsize]num)
stack[(*pointer)]endchars保存TF规约结果变量保存前字符终结符
}
else if(productionr6)
{
string sstack[(*pointer)]endchar规约前记录规约字符代表变量
int p(*pointer_state)
p
char secondstate_stack[p]
int igetraw(second)
int jgetcol('T')
char c_outgetraw_content(table[i][j])
cout<<\t\t\tr6T>F规约
popstack(state_stackpointer_state1)
popstackc(stackpointer1)
char c'T'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
stack[(*pointer)]endchars记录变量赋值规约字符
}
else if(productionr7)
{
int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
string sfstack[po]endchar应 F
po2
string spstack[po]endchar规约前记录规约字符代表变量应 P
tsize++新增时变量
t[tsize]numtsize+1面四表达式面规约式进行赋值
t[tsize]operate'^'
t[tsize]var1sp
t[tsize]var2sf
cout<<\t(<
int p(*pointer_state)
p3
char secondstate_stack[p]
int igetraw(second)
int jgetcol('F')
char c_outgetraw_content(table[i][j])
cout<<\tr7F>P^F规约
popstack(state_stackpointer_state3)
popstackc(stackpointer3)
char c'F'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
string sget_tx(t[tsize]num)
stack[(*pointer)]endchars保存P^F规约结果变量保存前字符终结符
}
else if(productionr8)
{
int p(*pointer_state)
p
char secondstate_stack[p]
int igetraw(second)
int jgetcol('F')
char c_outgetraw_content(table[i][j])
cout<<\t\t\tr8F>P规约
string sstack[(*pointer)]endchar规约前记录规约字符代表变量
popstack(state_stackpointer_state1)
popstackc(stackpointer1)
char c'F'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
stack[(*pointer)]endchars记录变量赋值规约字符
}
else if(productionr9)
{
int p(*pointer_state)
p3
char secondstate_stack[p]
int igetraw(second)
int jgetcol('P')
char c_outgetraw_content(table[i][j])
cout<<\t\t\tr9P>(E)规约
int po(*pointer)P规约该表达式效变量Eendchar中需找E位置面操作
po
string sstack[po]endchar规约前记录规约字符代表变量
popstack(state_stackpointer_state3)
popstackc(stackpointer3)
char c'P'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
stack[(*pointer)]endchars记录变量赋值规约字符
}
else if(productionr10)
{
int p(*pointer_state)
p
char secondstate_stack[p]
int igetraw(second)
int jgetcol('P')
char c_outgetraw_content(table[i][j])
cout<<\t\t\tr10P>i规约
popstack(state_stackpointer_state1)
popstackc(stackpointer1)
char c'P'str[(*index)]
pushstack(stackpointerstate_stackpointer_statecc_out1)
stack[(*pointer)]endchari
}
else if(productionacc)
{
cout<<\t\t\tacc 分析成功
(*index)++
}
}
int main()
{
char str[size]接受字符串数组
char_stack stack[size]进行栈
int pointer1指栈顶指针
int length0记录字符串长度
int index0记录输入字符串
char top
char state_stack[size]状态栈
int pointer_state1状态栈指针
int iji表示行j表示列
string production
bool matchfalse
cout<
lengthgetLength(str)
str[length]'#'
str[length+1]'\0'
pointer++
stack[pointer]content'#'
pointer_state++
state_stack[pointer_state]'0'
cout<<步骤\t状态栈\t符号栈\t前符号\t输入串\t四元式\t\t说明<
{
topgettop(state_stackpointer_state)获取状态栈栈顶元素
igetraw(top)
jgetcol(str[index])
productiontable[i][j]
switch_method(stack&pointerstate_stack&pointer_stateproductionstr&index)
}
return 0
}
面运行结果根文法产生面语法树语句
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档