#include <iostream>#include <vector>#include <map>#include <set>#include <string>using namespace std;map<string, set<string>> first;void compute_first(string non_terminal, vector<vector<string>> productions) { for (auto production : productions) { if (production[0] == non_terminal) { if (production[1] == "epsilon") { first[non_terminal].insert("epsilon"); } else if (islower(production[1][0])) { first[non_terminal].insert(production[1]); } else { compute_first(production[1], productions); for (auto element : first[production[1]]) { first[non_terminal].insert(element); } } } }}int main() { vector<vector<string>> productions = { {"S", "AB"}, {"A", "aA"}, {"A", "epsilon"}, {"B", "bB"}, {"B", "epsilon"} }; for (auto production : productions) { compute_first(production[0], productions); } for (auto element : first) { cout << "First(" << element.first << ") = { "; for (auto value : element.second) { cout << value << " "; } cout << "}" << endl; } return 0;}
时间: 2024-01-13 21:03:10 浏览: 72
#include <iostream>
这段代码是一个用于计算文法中每个非终结符的 First 集的程序。
首先定义了一个名为 `first` 的 map,用于存储每个非终结符的 First 集合。然后定义了一个名为 `compute_first` 的函数,用于计算每个非终结符的 First 集合。该函数接受两个参数,一个是当前非终结符的名称,另一个是文法中所有产生式的向量。
在函数中,遍历每个产生式,如果产生式的第一个符号与当前非终结符匹配,则分三种情况进行处理:
1. 如果产生式右部第二个符号是 ε(空串),则将 ε 加入当前非终结符的 First 集中。
2. 如果产生式右部第二个符号是小写字母,则直接将该字母加入当前非终结符的 First 集中。
3. 如果产生式右部第二个符号是非终结符,则递归调用 `compute_first` 函数计算该非终结符的 First 集,然后将其加入当前非终结符的 First 集中。
最后,在 `main` 函数中,定义了文法中的所有产生式,然后遍历每个产生式,调用 `compute_first` 函数计算每个非终结符的 First 集合,并将结果输出到控制台上。
阅读全文