什么是算符優(yōu)先分析法
算符優(yōu)先分析法是一種簡(jiǎn)單、直觀的自下而上分析法
算符優(yōu)先分析法就是仿照算術(shù)表達(dá)式的四則運(yùn)算過(guò)程而設(shè)計(jì)的一種語(yǔ)法分析方法。
這種分析方法首先要規(guī)定運(yùn)算符之間(確切地說(shuō)終結(jié)符之間)的優(yōu)先關(guān)系和結(jié)合性質(zhì),然后借助這種關(guān)系,比較相鄰運(yùn)算符的優(yōu)先級(jí)來(lái)確定句型的可歸約串并進(jìn)行歸約。
分析步驟為:
1、擴(kuò)展文法
S’ →#S#
2、求FIRSTVT()和LASTVT()集合
firstvt(S)={ a,^,( }
firstvt(T)={ , } ∪ firstvt(S) = {, ,a,^,( }
lastvt(S)= { a,^,) }
lastvt(T) = { , } ∪ lastvt(S) = { , ,a,^,) }
3、求優(yōu)先關(guān)系
3.1 首先找 等于關(guān)系(兩個(gè)vt之間只隔一個(gè)vn)
3.2 低于關(guān)系(vt在右,vn在左)
3.3 高于關(guān)系(vn在左,vt在右)
4、構(gòu)造優(yōu)先關(guān)系表
5、算符優(yōu)先分析過(guò)程
一、實(shí)驗(yàn)?zāi)康?/p>
運(yùn)用算符優(yōu)先語(yǔ)法分析的基本原理實(shí)現(xiàn)對(duì)于句子的語(yǔ)法分析
二、實(shí)驗(yàn)要求
1、文法及待分析符號(hào)串由用戶輸入
2、數(shù)據(jù)結(jié)構(gòu)可自行設(shè)計(jì)
三、實(shí)驗(yàn)內(nèi)容
1、任意輸入一個(gè)文法,判斷它是否為簡(jiǎn)單優(yōu)先文法
2、如果是,請(qǐng)構(gòu)造該文法對(duì)應(yīng)的簡(jiǎn)單優(yōu)先分析表
3、輸入一個(gè)字符串,判斷它是否為該文法的一個(gè)句子。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-463871.html
四、實(shí)驗(yàn)代碼文章來(lái)源地址http://www.zghlxwxcb.cn/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]; //存儲(chǔ)拆分后的文法
int vi = 0; //存儲(chǔ)拆分后有多少行
int t = 0;
int s = 0;
int l;
int r;
string FIRSTVT[20][2]; //存儲(chǔ)firstvt集
string LASTVT[20][2]; //存儲(chǔ)lastvt集
string str; //存儲(chǔ)輸入文法
string str_a = "#"; // 下堆棧
string str_b; // 剩余輸入串
string analysis_table[100][5]; // 文法分析過(guò)程
char table[100][100]; // 算符優(yōu)先關(guān)系表
void init_string(string &a) // 刪除字符串的第一個(gè)元素
{
for (int i = 1; i <= a.length(); ++i)
{
a[i - 1] = a[i];
}
}
bool is_CHAR(char c) // 判斷是否為大寫(xiě)字母
{
if (c >= 'A' && c <= 'Z')
{
return true;
}
else
{
return false;
}
}
bool is_in(int i, string x) // 判斷從字符串x從最好一個(gè)開(kāi)始算起連續(xù)的i個(gè)字符是否含有非大寫(xiě)字母
{
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在算符優(yōu)先關(guān)系表中的位置
{
for (int i = 0; i <= s; ++i)
{
if (table[i][0] == a)
{
return i;
}
}
return -1;
}
void get_start() //獲取非終結(jié)符
{
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是否在序號(hào)為a的firstvt中,沒(méi)有則加入
{
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(
到了這里,關(guān)于編譯原理:算符優(yōu)先分析實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!