43 if (!textFile.is_open())
45 std::cerr <<
"Can't open CFL grammar file `" <<
fileName <<
"`" << std::endl;
49 std::string lineString;
50 std::string lines =
"";
51 std::string startString;
52 std::string symbolString;
53 const std::string WHITESPACE =
" \n\r\t\f\v";
56 while (getline(textFile, lineString))
62 else if (lineNum == 3)
65 size_t start = lineString.find_first_not_of(WHITESPACE);
66 size_t end = lineString.find_last_not_of(WHITESPACE);
67 if (start != std::string::npos && end != std::string::npos)
69 symbolString = lineString.substr(start, end - start + 1);
74 size_t start = lineString.find_first_not_of(WHITESPACE);
75 size_t end = lineString.find_last_not_of(WHITESPACE);
76 if (start != std::string::npos && end != std::string::npos)
78 lines.append(lineString.substr(start, end - start + 1));
85 size_t productionsPos = lines.find(
"Productions:");
86 if (productionsPos != std::string::npos)
88 lines = lines.substr(productionsPos + std::string(
"Productions:").
length());
94 while ((pos = symbolString.find(
" ")) != std::string::npos)
96 sString =
stripSpace(symbolString.substr(0, pos));
97 symbolString.erase(0, pos + 1);
101 grammar->insertSymbol(symbolString);
105 grammar->insertTerminalKind(
"epsilon");
144 std::string delimiter =
" ";
145 std::string delimiter1 =
"->";
146 std::string word =
"";
151 for (
auto wordProd : wordProdVec)
154 if ((pos = wordProd.find(delimiter1)) != std::string::npos)
157 std::string RHS =
stripSpace(wordProd.substr(0, pos));
158 std::string LHS =
stripSpace(wordProd.substr(pos + delimiter1.size()));
162 prod.push_back(RHSSymbol);
165 if (
grammar->getRawProductions().find(RHSSymbol) ==
grammar->getRawProductions().end())
167 grammar->getRawProductions().insert({RHSSymbol, {}});
171 while ((pos = LHS.find(delimiter)) != std::string::npos)
175 LHS.erase(0, pos + delimiter.length());
178 prod.push_back(
grammar->insertSymbol(word));
188 grammar->getRawProductions().at(RHSSymbol).insert(prod);