编译原理--生成四元式
实验原理
构造SLR(1)分析表
首先求得follow集
follow(E)={#,+,-,)}
follow(T)={#,+,-,),,/}
follow(F)={#,+,-,),,/}
画出DFA状态转换图
调试过程
没有判断
因为字符串中没有表示10以上的字符所以只能存之后的符号
最后就能得到正确答案
#include <stdio.h>
#include <string.h>
/**文法G[S]**/
//0 E'->E
//1 E->T
//2 E->E+T
//3 E->E-T
//4 T->F
//5 T->T*F
//6 T->T/F
//7 F->I
//8 F->(E)
//a*(b+c*(a-b))#
//a*b+c/d#
//四元式用到的全局变量
char sem[50]; //语义栈,存放id(指向标识符地址的指针)或四元式编号
int sem1=0; //语义栈指针
char t='1'; //假设为结果集变量
char id;
char Tri[15][30]; //存放四元式
int tr=0; //四元式集指针
//状态栈
int s1=0;
int states1[50]={
0};
//符号栈
int f1=0;
char fuhao1[50]={
'#'};
//输入栈
int in1=0;
char input1[50];
char flag; //定位action表或goto表中的某一个位置
//定义SLR(1)_action表
char action1[16][8]=
//数字:下一个状态集编号(10:':' 11:';' 12:'<' 13:'=' 14:'>' 15:'?') 字母:规约的产生式编号 *:结束规约
{
// + - * / ( ) i #
{
' ',' ',' ',' ','5',' ','4',' '}, //0
{
'6','7',' ',' ',' ',' ',' ','*'}, //1
{
'a','a','8','9',' ','a',' ','a'}, //2
{
'd','d','d','d',' ','d',' ','d'}, //3
{
'g','g','g','g',' ','g',' ','g'}, //4
{
' ',' ',' ',' ','5',' ','4',' '}, //5
{
' ',' ',' ',' ','5',' ','4',' '}, //6
{
' ',' ',' ',' ','5',' ','4',' '}, //7
{
' ',' ',' ',' ','5',' ','4',' '}, //8
{
' ',' ',' ',' ','5',' ','4',' '}, //9
{
'6','7',