编译原理 语法分析—(1)递归下降分析法
实验目的
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行 分析。本次实验的目的主要是加深对递归下降分析法的理解。
实验环境
Microsoft Visual Studio 2019 Community
思路
为每一个产生式编写一个函数。按照产生式,如果是终结符则直接匹配输入的字符与要求的终结符是否匹配;若是非终结符,调用非终结符对应的函数,传入字符串与开始匹配的位置作为参数。其中任意一步发现不符合语法规则,就认为该字符串有错误。当递归全部终结都没发现错误后,还需要判断是否还有剩余的字符未匹配。如果还有未匹配字符,说明该字符串仍然是不符合语法规则的,因为从开始符无法转换到相应的状态。
产生式
(1)E->eBaA
(2)A->a|bAcB
(3)B->dEd|aC
(4)C->e|dC
//SyntaxAnalysis.h
#pragma once
#include <iostream>
#include <ostream>
#include <stack>
#include <fstream>
#include <vector>
#include <set>
#include <sstream>
using namespace std;
/// <summary>
/// 递归下降分析法词法分析
/// </summary>
class SyntaxAnalysis_RecursiveDescentParsing
{
static bool E(string str, int& pos);
static bool A(string str, int& pos);
static bool B(string str, int& pos);
static bool C(string str, int& pos);
public:
static void SyntaxAnalyse_RecursiveDescentParsing(string str);
};
//SyntaxAnalysis.cpp
#include "SyntaxAnalysis.h"
using namespace std;
/// <summary>
/// 非终结符E
/// </summary>
/// <param name="str">要分析的字符串</param>
/// <param name="pos">开始分析的位置,下标从0开始</param>
/// <returns>该字符串是否符合文法</returns>
bool SyntaxAnalysis_RecursiveDescentParsing::E(string str, int& pos)
{
char ch = str[pos];
if (ch != 'e')
{
cout << "E:第"