用算符优先法进行表达式分析
实验目的
了解用算符优先分析法进行语法分析的方法。
实验内容要求
从键盘输入表达式,利用算符优先分析法求出其值,如输入表达式有错,则给出报错提示。表达式以;结尾。例:以于如下的输入表达式串: 13+5*4;则应给出结果为33。
实验原理
我们要分析的表达式满足下面的算符优先矩阵
算法描述
为实现算符优先算法,可以使用两个工作栈。一个叫做OPTR,用以寄存运算符,一个叫OPND,用以寄存操作数或结果。算法描述如下:
[1]首先置操作数栈为空栈,将表达式起始符;作为运算符栈的栈底元素。
[2]依次读入表达式中每个单词,若是操作数则进OPND栈,若是运算符则转[3]。
[3]将此运算符θ1与OPTR栈顶元素θ2进行比较,即查上表, 若 θ1>θ2,则:θ1进栈,转[2]
若 θ1=θ2 ,如θ1为;,则分析成功,否则OPTR栈顶元素出栈,并转[2]
若 θ1<θ2,则出栈OPND栈顶元素至b,又出栈其栈顶元素至a,出栈OPTR栈顶元素至t,进行运算r=a t b(t 为运算符),并将结果r存入栈OPND后转[3]。
若θ1和θ2之间无优先关系,则报错。
代码实现
利用以前实验生成的Getsym()进行单词识别,并自组织工程文件,这部分先参照我主页里的《手工生成PL/0语言词法分析器》文档来进行代码衔接。关于算符优先算法要用到的部份函数提示如下。
[1]一些自定义的变量和函数的声明
#define MAX 255
SYMBOL title[7]= {
PLUS,MINUS,TIMES,SLASH,LPAREN,RPAREN,SEMICOLON}; //用来将相应的种别码与数组下标进行映射
char oo[7][7]={
{
'>','>','<','<','<','>','>'},
{
'>','>','<','<','<','>','>'},
{
'>','>','>','>','<','>','>'},
{
'>','>','>','