PL/0语言 自上而下语法分析 递归下降分析

一、简介

PL0 语言功能简单、结构清晰、可读性强,而又具备了一般高级程序设计语言的必须部分,因而 PL0 语言的编译程序能充分体现一个高级语言编译程序实现的基本方法和技术。
分析对象〈算术表达式〉的 BNF 定义如下:
<表达式> ::= [+|-]<项>{<加法运算符> <项>}
<项> ::= <因子>{<乘法运算符> <因子>}
<因子> ::= <标识符>|<无符号整数>| ‘(’<表达式>‘)’
<加法运算符> ::= +|-
<乘法运算符> ::= *|/

二、设计思想

1、表达式的文法

按照扩充的巴克斯范式书写:
E -> [+|-]T{AT}
T -> F{MF}
F -> I|N|(E)
A -> +|-
M -> *|/
I -> (a|…|z|A|…|Z){a|…|z|A|…|Z|0|…|9}
N -> (1|…|9){0|…|9}
经过分析,非终结符A、M、I、N在采用递归下降分析程序中是无需单独写为函数的,可以和其他非终结符合并书写,因为他们可以理解为终结符来用。

三、算法流程

算法的流程图就是对各种单词符号的组合进行判断。
整个程序分为主程序和三个子程序,三个子程序即递归调用的函数。
PL/0语言 自上而下语法分析 递归下降分析_第1张图片
PL/0语言 自上而下语法分析 递归下降分析_第2张图片

四、源程序

语言:c++

#include 
#define plus 0      // +
#define minus 1     // -
#define times 2     // *
#define slash 3     // /
#define lparen 4    // (
#define rparen 5    // )
#define ident 6     // 标识符
#define number 7    // 无符号整数
#define finish 8    // 完成
#include 
#include 
using namespace std;

//ifstream symbol;//读文件使用
int sym;//当前的输入符号
bool error;//判断分析成功与否
void advance();//读入下一单词符号
void expression();//表达式--递归下降子程序
void term();//项--递归下降子程序
void factor();//因子--递归下降子程序

void advance()//读入下一单词符号
{
    //if(!symbol.eof())//从文件读取
    //{
    static int count=7;//需要设置一个读取结束标志,故以读取次数结束
    if(count>0)
    {
        count--;
        string temp;
        //getline(symbol,temp);//读取一行(读文件使用)
        cin>>temp;
        int word_begin=temp.find(',');//找到单词符号的结尾
        string keyword=temp.substr(1,word_begin-1);//将单词符号截取出来,去掉无用字符
        //cout<
        if(keyword=="plus")sym=plus;
        else if(keyword=="minus")sym=minus;
        else if(keyword=="times")sym=times;
        else if(keyword=="slash")sym=slash;
        else if(keyword=="lparen")sym=lparen;
        else if(keyword=="rparen")sym=rparen;
        else if(keyword=="ident")sym=ident;
        else if(keyword=="number")sym=number;
        else sym=finish;//单词错误,分析结束
    }
    else
	{
        //cout<<"分析结束!"<
        sym=finish;
    }
}

void expression()//表达式--递归下降子程序
{
    if((sym==plus)||(sym==minus))advance();//表达式前面的符号可有可无,有时需要读入下一符号
    term();
    while((sym==plus)||(sym==minus))//后面一段可以重复多次
    {
        advance();
        term();
    }
}

void term()//项--递归下降子程序
{
    factor();
    while((sym==times)||(sym==slash))//后面一段可以重复多次
    {
        advance();
        factor();
    }
}

void factor()//因子--递归下降子程序
{
    if(sym==ident)advance();//单词为标识符
    else if(sym==number)advance();//单词为无符号整数
    else if(sym==lparen)//单词为左括号
    {
        advance();
        expression();
        if(sym==rparen)advance();//右括号匹配
        else
        {
            error=false;//分析报错
            //cout<<"右括号不匹配"<
        }
    }else
    {
        error=false;//分析报错
        //cout<<"符号不属于因子!"<
    }
}

int main()
{
    error=true;//默认分析成功
    //symbol.open("result.txt");//打开文件,获取数据
    advance();
    expression();//表达式是起始分析点
    if(error)printf("Yes,it is correct.\n");
    else printf("No,it is wrong.\n");
    //symbol.close();
    return 0;
}

五、数据测试

注意输入也是有2种方式,记得在程序里修改。
输入输出示例:
PL/0语言 自上而下语法分析 递归下降分析_第3张图片

你可能感兴趣的:(c++)