编译原理实验需要实现First集、Follow集和Select集的求解算法,但看好多篇文章都不尽如人意,而且有些写的还有错误的地方,加大了理解的难度。于是就用C++完成了相关集合的代码实现,下面把实现过程分享给大家!
?先直接奉上代码链接,迫不及待的小伙伴可以去看啦!
CSDN:编译原理FFS.zip
码云:编译原理FFS
结构定义
struct Line {
string from;
vector<string> value;
string strs;
//整个产生式对应字符串
};
struct WenFa {
vector<string> fzj;//非终结符
vector<string> zj;//终结符
string start;//开始符号
vector<Line> rule;//产生式集合
map<string, vector<string>> first;
map<string, vector<string>> follow;
map<string, vector<string>> select;
void Read(string);
vector<string> getFirst(string);
vector<string> getFollow(string);
void Change();
void Print();
};
输入格式
对于如图文法,输入文件内容如下;
刚发现输入文件结尾需要多空行,暂时就不更改啦!
3
S T T'
5
a ^ ( ) ,
6
S -> a
S -> ^
S -> ( T )
T -> S T'
T' -> , S T'
T' -> ε
S
?函数运行
记住修改文件名称,否则无法读取到输入文件,还要注意文件路径位置;
全部函数代码见分享链接;
int main(int argc, char *argv[]) {
WenFa wf;
string path;
if (argc > 1)
path = *(++argv);
else
path = "Input.txt";
wf.Read(path);//读文件
wf.Change();//求集合
wf.Print();//输出结果
return 0;
}
运行结果
非终结符集:
S T T'
终结符集:
a ^ ( ) ,
产生式集:
0: S -> a
1: S -> ^
2: S -> ( T )
3: T -> S T'
4: T' -> , S T'
5: T' -> ε
开始符号:
S
First Set:
First( S ): a ^ (
First( T ): a ^ (
First( T'): , ε
Follow Set:
Follow( S ): # ) ,
Follow( T ): )
Follow( T'): )
Select Set:
Select( S -> a ): a
Select( S -> ^ ): ^
Select( S -> ( T ) ): (
Select( T -> S T' ): a ^ (
Select( T' -> , S T'): ,
Select( T' -> ε ): )
结束
编译原理相关实验内容都可以私信哦!
|