什么是算符优先分析法
算符优先分析法是一种简单、直观的自下而上分析法
算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法。
这种分析方法首先要规定运算符之间(确切地说终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串并进行归约。
分析步骤为:
1、扩展文法
S’ →#S#
2、求FIRSTVT()和LASTVT()集合
firstvt(S)={ a,^,( }
firstvt(T)={ , } ∪ firstvt(S) = {, ,a,^,( }
lastvt(S)= { a,^,) }
lastvt(T) = { , } ∪ lastvt(S) = { , ,a,^,) }
3、求优先关系
3.1 首先找 等于关系(两个vt之间只隔一个vn)
3.2 低于关系(vt在右,vn在左)
3.3 高于关系(vn在左,vt在右)
4、构造优先关系表
5、算符优先分析过程
一、实验目的
运用算符优先语法分析的基本原理实现对于句子的语法分析
二、实验要求
1、文法及待分析符号串由用户输入
2、数据结构可自行设计
三、实验内容
1、任意输入一个文法,判断它是否为简单优先文法
2、如果是,请构造该文法对应的简单优先分析表
3、输入一个字符串,判断它是否为该文法的一个句子。文章来源:https://www.toymoban.com/news/detail-463871.html
四、实验代码文章来源地址https://www.toymoban.com/news/detail-463871.html
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <stack>
#include <iomanip>
#include <cstdlib>
using namespace std;
string V[100][2]; //存储拆分后的文法
int vi = 0; //存储拆分后有多少行
int t = 0;
int s = 0;
int l;
int r;
string FIRSTVT[20][2]; //存储firstvt集
string LASTVT[20][2]; //存储lastvt集
string str; //存储输入文法
string str_a = "#"; // 下堆栈
string str_b; // 剩余输入串
string analysis_table[100][5]; // 文法分析过程
char table[100][100]; // 算符优先关系表
void init_string(string &a) // 删除字符串的第一个元素
{
for (int i = 1; i <= a.length(); ++i)
{
a[i - 1] = a[i];
}
}
bool is_CHAR(char c) // 判断是否为大写字母
{
if (c >= 'A' && c <= 'Z')
{
return true;
}
else
{
return false;
}
}
bool is_in(int i, string x) // 判断从字符串x从最好一个开始算起连续的i个字符是否含有非大写字母
{
bool flag = false;
for (int j = 0; j < i; j++)
{
if (!is_CHAR(x[x.length() - j - 1]))
{
flag = true;
}
}
return flag;
}
void split(string a) // 拆分文法,使其不含有|
{
for (int i = 3; i < a.length(); ++i)
{
V[vi][0] = a[0];
while (a[i] != '|' && i < a.length())
{
V[vi][1] += a[i];
i++;
}
vi++;
}
}
void read_file(string file_path) //按行读取文件
{
fstream f;
f.open(file_path.c_str());
vector<string> words;
string line;
while (getline(f, line))
{
words.push_back(line);
}
cout << "输入文法:" << endl;
for (int i = 0; i < words.size(); i++)
{
cout << words[i] << endl;
split(words[i]);
}
}
int find_index(char a) //寻找字符a在firstvt或者lastvt中的位置
{
for (int i = 0; i < t; ++i)
{
if (FIRSTVT[i][0][0] == a)
{
return i;
}
}
return -1;
}
int find_table_index(char a) //寻找字符a在算符优先关系表中的位置
{
for (int i = 0; i <= s; ++i)
{
if (table[i][0] == a)
{
return i;
}
}
return -1;
}
void get_start() //获取非终结符
{
for (int i = 0; i < vi; ++i)
{
bool flag = true;
for (int j = 0; j < t; ++j)
{
if (FIRSTVT[j][0] == V[i][0])
{
flag = false;
}
}
if (flag)
{
FIRSTVT[t][0] = V[i][0];
LASTVT[t][0] = V[i][0];
t++;
}
}
}
void add_firstvt(string b, int a) //判断字符串b是否在序号为a的firstvt中,没有则加入
{
for (int s = 0; s < b.length(); ++s)
{
bool flag = true;
char c = b[s];
if (c <= 'Z' && c >= 'A')
{
continue;
}
for (int i = 0; i < FIRSTVT[a][1].length(); ++i)
{
if (c == FIRSTVT[a][1][i])
{
flag = false;
}
}
if (flag)
{
FIRSTVT[a][1] += c;
}
}
}
void add_firstvt(
到了这里,关于编译原理:算符优先分析实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!