代码调整;
This commit is contained in:
parent
7d554d38c4
commit
0c5a118791
@ -1,8 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.17)
|
cmake_minimum_required(VERSION 3.17)
|
||||||
project(syntaxParser)
|
project(syntaxParser)
|
||||||
|
|
||||||
find_package(Boost REQUIRED)
|
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
set(CMAKE_CXX_STANDARD 14)
|
||||||
|
|
||||||
add_executable(syntaxParser main.cpp)
|
add_executable(syntaxParser main.cpp)
|
64
main.cpp
64
main.cpp
@ -1,11 +1,13 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -13,6 +15,7 @@ using std::vector;
|
|||||||
using std::string;
|
using std::string;
|
||||||
using std::stringstream;
|
using std::stringstream;
|
||||||
using std::pair;
|
using std::pair;
|
||||||
|
using std::shared_ptr;
|
||||||
|
|
||||||
struct Symbol {
|
struct Symbol {
|
||||||
|
|
||||||
@ -20,9 +23,9 @@ struct Symbol {
|
|||||||
const string name;
|
const string name;
|
||||||
const bool terminator;
|
const bool terminator;
|
||||||
|
|
||||||
Symbol(int index, const string & name, bool terminator):
|
Symbol(int index, string name, bool terminator):
|
||||||
index(index),
|
index(index),
|
||||||
name(name),
|
name(std::move(name)),
|
||||||
terminator(terminator)
|
terminator(terminator)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -36,19 +39,54 @@ public:
|
|||||||
|
|
||||||
int addSymbol(const string& name, bool terminator) {
|
int addSymbol(const string& name, bool terminator) {
|
||||||
const auto &it = table.find(name);
|
const auto &it = table.find(name);
|
||||||
if ((it) != table.end()) {
|
if (it != table.end()) {
|
||||||
return it->second.index;
|
return it->second.index;
|
||||||
}
|
}
|
||||||
Symbol symbol = Symbol(index++, name, terminator);
|
Symbol symbol = Symbol(index++, name, terminator);
|
||||||
table.insert(pair<string, Symbol>(symbol.name, symbol));
|
table.insert(pair<string, Symbol>(symbol.name, symbol));
|
||||||
return symbol.index;
|
return symbol.index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getSymbolIndex(const string &name) {
|
||||||
|
const auto &it = table.find(name);
|
||||||
|
if(it != table.end()) {
|
||||||
|
return it->second.index;
|
||||||
|
} else {
|
||||||
|
throw runtime_error("symbol " + name + " NOT Found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 产生式
|
||||||
|
class Production {
|
||||||
|
const int left;
|
||||||
|
const vector<int> right;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Production(int left, vector<int> right): left(left), right(std::move(right)) {}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// 项
|
||||||
|
class Item{
|
||||||
|
// 对应的产生式
|
||||||
|
shared_ptr<Production> production;
|
||||||
|
// 点的位置
|
||||||
|
int dotIndex = 0;
|
||||||
|
public:
|
||||||
|
explicit Item(shared_ptr<Production> &&p_pdt) {
|
||||||
|
production = p_pdt;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ifstream input("syntaxInput.txt");
|
ifstream input("syntaxInput.txt");
|
||||||
|
|
||||||
|
|
||||||
map<string, set<string>> productions;//读入文件后,存放产生式
|
map<int, shared_ptr<Production>> productions;//读入文件后,存放产生式
|
||||||
map<string, set<string>> project;//在每个产生式右部前面加上点,得到初始项目集
|
map<string, set<string>> project;//在每个产生式右部前面加上点,得到初始项目集
|
||||||
map<int, set<string>> StateSet;//状态
|
map<int, set<string>> StateSet;//状态
|
||||||
map<int, set<string>> StateSetTemp;
|
map<int, set<string>> StateSetTemp;
|
||||||
@ -89,10 +127,10 @@ string& trim(string &&str) {
|
|||||||
|
|
||||||
//得到最初项目集
|
//得到最初项目集
|
||||||
void getProject() {
|
void getProject() {
|
||||||
productions["S\'"].insert("S");
|
|
||||||
//读入文法文件
|
//读入文法文件
|
||||||
int k = 1;
|
|
||||||
string temp_line;
|
string temp_line;
|
||||||
|
|
||||||
while (getline(input, temp_line)) {
|
while (getline(input, temp_line)) {
|
||||||
auto middle_index = temp_line.find("->", 0);
|
auto middle_index = temp_line.find("->", 0);
|
||||||
|
|
||||||
@ -102,15 +140,17 @@ void getProject() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string front = trim(temp_line.substr(0, middle_index));
|
string front = trim(temp_line.substr(0, middle_index));
|
||||||
|
int left = symbolTable.addSymbol(front, false);
|
||||||
|
|
||||||
string back = trim(temp_line.substr(middle_index + 2, temp_line.size() - middle_index - 2));
|
string back = trim(temp_line.substr(middle_index + 2, temp_line.size() - middle_index - 2));
|
||||||
|
|
||||||
stringstream terminator, non_terminator;
|
stringstream terminator, non_terminator;
|
||||||
|
vector<int> symbols;
|
||||||
bool is_terminator = false;
|
bool is_terminator = false;
|
||||||
for(const auto &c : back) {
|
for(const auto &c : back) {
|
||||||
if (c == '\"') {
|
if (c == '\"') {
|
||||||
if(is_terminator) {
|
if(is_terminator) {
|
||||||
symbolTable.addSymbol(trim(terminator.str()), true);
|
symbols.push_back(symbolTable.addSymbol(trim(terminator.str()), true));
|
||||||
terminator.str("");
|
terminator.str("");
|
||||||
terminator.clear();
|
terminator.clear();
|
||||||
}
|
}
|
||||||
@ -120,7 +160,7 @@ void getProject() {
|
|||||||
if(c == ' ') {
|
if(c == ' ') {
|
||||||
string temp_symbol = trim(non_terminator.str());
|
string temp_symbol = trim(non_terminator.str());
|
||||||
if(!temp_symbol.empty()) {
|
if(!temp_symbol.empty()) {
|
||||||
symbolTable.addSymbol(trim(non_terminator.str()), false);
|
symbols.push_back(symbolTable.addSymbol(trim(non_terminator.str()), false));
|
||||||
non_terminator.str("");
|
non_terminator.str("");
|
||||||
non_terminator.clear();
|
non_terminator.clear();
|
||||||
}
|
}
|
||||||
@ -133,12 +173,14 @@ void getProject() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
productions[temp_line.substr(0, 1)].insert(temp_line.substr(3, temp_line.length() - 3 + 1));
|
auto p_pdt = make_shared<Production>(left, symbols);
|
||||||
css_by_order[k++] = temp_line;
|
|
||||||
|
productions[left] = p_pdt;
|
||||||
}
|
}
|
||||||
|
|
||||||
//构造基本项目集,即圆点位于右部开头的位置
|
//构造基本项目集,即圆点位于右部开头的位置
|
||||||
string dot = "*";
|
string dot = "*";
|
||||||
for(map<string, set<string>>::iterator it = productions.begin(); it != productions.end(); it++) {
|
for(const auto &item : productions) {
|
||||||
for(set<string>::iterator ij =it->second.begin(); ij != it->second.end(); ij++) {
|
for(set<string>::iterator ij =it->second.begin(); ij != it->second.end(); ij++) {
|
||||||
string startStr = *ij;
|
string startStr = *ij;
|
||||||
startStr.insert(0, dot, 0, 1);
|
startStr.insert(0, dot, 0, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user