算符优先分析法语法分析-编译原理
一、设计目的
通过课程设计,真正掌握设计和构造编译程序的基本原理和常用的编译技术,具备系统软件调试能力和开发能力,培养分析问题和解决问题的能力。
二、设计内容
对以下文法,采用算符优先分析法,对G[S]所定义的赋值语句进行语法分析,并在语法分析过程中将所输入的赋值语句翻译为四元式。
1.直接输入根据已知文法构造的算符优先关系矩阵。
2.输入已知文法的FIRSTVT和LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。
S → A
A → V:=E
E → E + T | T
T → T * F | F
F → (E) | i
V → i
•确定文法的机内表示形式;
•确定优先关系矩阵的存放方式
三、设计思想和主要数据结构
首先求出该文法的优先关系表,在程序中用2文数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。
在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。
数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。
四、心得体会
开始的时候由于编译原理课学的不怎么好,连题目都看不懂,后面又把课本又复习了一下,才选了算符优先文法。通过设计,对算符优先文法有了更深入的了解,原来并不理解算符优先文法为什么会设计成那样,后面经过程序的逐步调试,也逐步理解算符文法的设计原理。
由于我们班选编译课设的人就我一个,因此在设计程序的时候很难受,完全没有讨论的机会。
五、程序清单
// 编译原理.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
/****************************************/
/* 算符优先分析程序*/
/****************************************/
struct Lchar
{
char char_ch;
struct Lchar *next;
}LLchar,*p,*h,*temp,*top,*base;
int table[7][7]={{0,1,1,1,0,1,1},
{-1,1,0,-1,-1,1,1},
{-1,-1,0,-1,-1,0,1},
{-1,1,0,1,-1,1,1},
{-1,-1,0,-1,-1,0,0},
{0,1,0,1,0,1,1},
{-1,0,-1,0,0,0,-1}};
//存储算符优先关系表,大于为,小于或等于为-1,其它为表示出错
char curchar;
char curcmp;
int right; /*设置开关项,当出错时为*/
int i,j;
int k; /*比较字符在栈的位置*/
void push(char pchar) /*入栈函数*/
{
temp=(Lchar*)malloc(sizeof(LLchar));
temp->char_ch=pchar;
temp->next=top;
top=temp;
}
char pop(void) /*出栈函数*/
{
char c;
c=top->char_ch;
if(top->char_ch!='#') {
top=top->next;
}
return c;
}
int changchartoint(char ch) /*将字符转为数字,以得到算符优先值*/
www.751com.cn
case 'i':t=0;break;
case '+':t=1;break;
case '=':t=2;break;
case '*':t=3;break;
case '(':t=4;break;
case ')':t=5; break;
case '#': t=6;
}
return t;
}
void guiyue(){
char tempc;
char tempc1;
char tempc2;
char tempc3;
char popc;
tempc = pop();
tempc1=pop();
if(tempc=='i')
{
if(tempc1=='#')
{
push('V');
k=1;
}917