測試樣例
ll1, 類ll1繼承了base, 用於生成**表和分析輸入語句.
記號和規定
#ifndef _base_h_
#define _base_h_
#include
#include
#include
#include
#include
#define maxsize 100
using
namespace
std;
struct node ;
class base ;
void inputandsolve(); // 處理和求出first和follow集
void displayfirstandfollow(); // 輸出first和follow集
};#endif
#include "base.h"
bool base::isnonterminal(char c)
int base::getnindex(char target)
return -1;
}int base::getindex(char target)
return -1;
}void base::getfirst(char target)
else
getfirst(yj);// yj是非終結符,遞迴 先求出first(yj)
set::iterator it;
int yjindex = getnindex(yj);
for (it = firstset[yjindex].begin(); it != firstset[yjindex].end(); it++)
if (isempty == 0) // yj不能產生空, 迭代結束
break;
else
}if (countempty == production[i].right.length())//所有右部first(y)都有$(空),將$加入first(x)中
firstset[getnindex(target)].insert('$');}}
}}void base::getfollow(char target)
}if (index != -1 && index < len - 1)
else
if (hasempty && production[i].left != target) }}
else
if (index != -1 && index == len - 1 && target != production[i].left)
}}void base::inputandsolve()
production[index].left = temp[0]; // 產生式的左部
for (int i = 3; i// 產生式的右部
production[index].right += temp[i];
for (int i = 0; i < temp.length(); i++)
}if (!flag) nonterminal.push_back(temp[i]);
}else
}if (!flag) terminal.push_back(temp[i]);}}
}terminal.push_back('#');
for (int i = 0; i < terminal.size(); i++)
// 獲得first集
for (int i = 0; i < nonterminal.size(); i++)
// 獲得follow集
for (int i = 0; i < nonterminal.size(); i++)
}void base::displayfirstandfollow()
cout
<< endl;
cout
<< "follow集合"
<< endl;
for (int i = 0; icout
<< nonterminal[i] << ": ";
set::iterator it;
for (it = followset[i].begin(); it != followset[i].end(); it++)
cout
<< *it << " ";
cout
<< endl;
}cout
<< endl;
}
#ifndef _ll1_h_
#define _ll1_h_
#include"base.h"
class ll1 : public base ;
#endif
}
#include"ll1.h"
ll1::ll1()
void ll1::gettable()
break;
}else
if (firstset[tmpindex].count('$') != 0)
else }}
// 2) 如果空$在first(α)中,對follow(a)中的每個終結符或結束符b,將i加入(a,b)中
if (emptycount == production[index].right.size()) }}
}void ll1::analyexpression(string s)
if (char1 == char2)
else
if (tablemap[getnindex(char1)][getindex(char2)] != -1)
cout
<< setw(15) << "推導:"
<< production[tg].left << "->"
<< production[tg].right << endl;
}else
}}void ll1::printpredicttable()
cout
<< endl;
for (int i = 0; i < nonterminal.size(); i++)
cout
<< endl;
}cout
<< endl;
}void ll1::getresult()
}
#include "ll1.h"
#include
int main()
8
e->ta
a->+ta
a->$
t->fb
b->*fb
b->$
f->(e)
f->i
i+i*i
編譯原理 LL(1)語法分析器
1.專案要求 文法要求 1 從檔案讀入,每條產生式占用一行 2 文法為ll 1 文法 從檔案中讀入文法,從鍵盤上輸入待分析的符號串,採用 ll 1 分析演算法判斷該符號串是否為該文法的句子。2.實驗思路 首先實現集合first x 構造演算法和集合follow a 構造演算法,再根據first和fo...
LL(1)語法分析
ll 1 分析法的功能是利用ll 1 控制程式根據顯示棧棧頂內容 向前看符號以及ll 1 分析表,對輸入符號串自上而下的分析過程。可通過消除左遞迴 提取左因子把非ll 1 文法改造成ll 1 文法。在 ll 1 分析程式設計過程中,最重要的兩個問題是 分析表的構造和相關資料結構的設計。而 分析表的構...
LL 1 語法分析
ll 1 文法分析是自頂向下的分析方法,也可以被看作是輸入串的最左推導過程,ll 1 中1的意思就是可以根據可以根據當前輸入串中的乙個字元來判斷是由哪乙個產生式產生。下面給出文法 e te e ate 代表空集 t ft t mft f i e i 0 1 2 9 a m 首先要構造first集合與...