Modules/Parser/applications/Cfg.cpp

76 lines
No EOL
1.5 KiB
C++

#include "NewPlacement.hpp"
#include "Parser.hpp"
#include "CommandLine.hpp"
using namespace tp;
void run(const String& source) {
auto state = CfGrammar::initializeCfGrammarParser();
CfGrammar grammar;
if (!grammar.parse(state, source)) {
printf("Parsing is failed\n");
return;
}
if (!grammar.compile()) {
printf("Compilation is failed\n");
return;
}
printf("Grammar accepted.\n");
List<CfGrammar::Sentence> sentences;
grammar.generateSentences(sentences);
printf("Example sentences formed from grammar: \n");
for (auto sentence : sentences) tp::CfGrammar::printSentence(sentence.data());
CfGrammar::deinitializeCfGrammarParser(state);
}
int main(int argc, const char* argv[]) {
tp::ModuleManifest* deps[] = { &tp::gModuleParser, &tp::gModuleCommandLine, nullptr };
tp::ModuleManifest testModule("CommandLineTest", nullptr, nullptr, deps);
if (!testModule.initialize()) {
return 1;
}
{
CommandLine cmd = {
{ "grammar", CommandLine::Arg::STR },
};
if (!cmd.parse((char) argc, argv, true, 1)) {
return 1;
}
auto location = cmd.getString("grammar");
LocalConnection file;
String grammar;
file.connect(LocalConnection::Location(location), LocalConnection::Type(true));
if (!file.getConnectionStatus().isOpened()) {
printf("Cant open file\n");
return 1;
}
auto size = file.size();
grammar.resize((String::Index) size);
file.readBytes(grammar.write(), size);
run(grammar);
file.disconnect();
}
testModule.deinitialize();
return 0;
}