handle errors in the parser and the main loop
This commit is contained in:
parent
e7222e3fb3
commit
1f19837e40
@ -26,7 +26,15 @@ static int mainLoop()
|
|||||||
|
|
||||||
// Prime the first token.
|
// Prime the first token.
|
||||||
fprintf(stderr, "ready> ");
|
fprintf(stderr, "ready> ");
|
||||||
|
try
|
||||||
|
{
|
||||||
parser->getNextToken();
|
parser->getNextToken();
|
||||||
|
}
|
||||||
|
catch (obelisk::LexerException& exception)
|
||||||
|
{
|
||||||
|
std::cout << "Error: " << exception.what() << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@ -40,7 +48,15 @@ static int mainLoop()
|
|||||||
<< parser->getLexer()->getIdentifier() << std::endl;
|
<< parser->getLexer()->getIdentifier() << std::endl;
|
||||||
std::cout << "Num: " << parser->getLexer()->getNumberValue()
|
std::cout << "Num: " << parser->getLexer()->getNumberValue()
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
try
|
||||||
|
{
|
||||||
parser->getNextToken();
|
parser->getNextToken();
|
||||||
|
}
|
||||||
|
catch (obelisk::LexerException& exception)
|
||||||
|
{
|
||||||
|
std::cout << "Error: " << exception.what() << std::endl;
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case obelisk::Lexer::kTokenFact :
|
case obelisk::Lexer::kTokenFact :
|
||||||
parser->handleFact(kb);
|
parser->handleFact(kb);
|
||||||
|
@ -22,8 +22,15 @@ std::unique_ptr<obelisk::Lexer>& obelisk::Parser::getLexer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int obelisk::Parser::getNextToken()
|
int obelisk::Parser::getNextToken()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
setCurrentToken(getLexer()->getToken());
|
setCurrentToken(getLexer()->getToken());
|
||||||
|
}
|
||||||
|
catch (obelisk::LexerException& exception)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
return getCurrentToken();
|
return getCurrentToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,6 +335,7 @@ void obelisk::Parser::parseFact(std::vector<obelisk::Fact>& facts)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
verb = getLexer()->getIdentifier();
|
verb = getLexer()->getIdentifier();
|
||||||
|
// TODO: make sure verb is alphabetic
|
||||||
getEntity = true;
|
getEntity = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -361,7 +369,6 @@ void obelisk::Parser::handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb)
|
|||||||
int verbId = 0;
|
int verbId = 0;
|
||||||
for (auto& fact : facts)
|
for (auto& fact : facts)
|
||||||
{
|
{
|
||||||
// TODO: doesn't work after first insert
|
|
||||||
std::vector<obelisk::Entity> entities {fact.getLeftEntity()};
|
std::vector<obelisk::Entity> entities {fact.getLeftEntity()};
|
||||||
kb->addEntities(entities);
|
kb->addEntities(entities);
|
||||||
fact.setLeftEntity(entities.front());
|
fact.setLeftEntity(entities.front());
|
||||||
@ -373,7 +380,8 @@ void obelisk::Parser::handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb)
|
|||||||
kb->getEntity(entity);
|
kb->getEntity(entity);
|
||||||
if (entity.getId() == 0)
|
if (entity.getId() == 0)
|
||||||
{
|
{
|
||||||
// TODO: throw an error here, it was not inserted, and doesn't exist in the database
|
throw obelisk::ParserException(
|
||||||
|
"left entity could not be inserted into the database");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -391,7 +399,8 @@ void obelisk::Parser::handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb)
|
|||||||
kb->getEntity(entity);
|
kb->getEntity(entity);
|
||||||
if (entity.getId() == 0)
|
if (entity.getId() == 0)
|
||||||
{
|
{
|
||||||
// TODO: throw an error here, it was not inserted, and doesn't exist in the database
|
throw obelisk::ParserException(
|
||||||
|
"right entity could not be inserted into the database");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -405,14 +414,23 @@ void obelisk::Parser::handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb)
|
|||||||
kb->addVerbs(verbs);
|
kb->addVerbs(verbs);
|
||||||
if (verbs.front().getId() != 0)
|
if (verbs.front().getId() != 0)
|
||||||
{
|
{
|
||||||
// The verb was inserted
|
|
||||||
fact.setVerb(verbs.front());
|
fact.setVerb(verbs.front());
|
||||||
verbId = fact.getVerb().getId();
|
verbId = fact.getVerb().getId();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// The verb is already already in the knowledge base
|
obelisk::Verb verb = fact.getVerb();
|
||||||
// TODO: SELECT the verb and save it into verbId
|
kb->getVerb(verb);
|
||||||
|
if (verb.getId() == 0)
|
||||||
|
{
|
||||||
|
throw obelisk::ParserException(
|
||||||
|
"verb could not be inserted into the database");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fact.setVerb(verb);
|
||||||
|
verbId = fact.getVerb().getId();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -420,10 +438,19 @@ void obelisk::Parser::handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb)
|
|||||||
fact.getVerb().setId(verbId);
|
fact.getVerb().setId(verbId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// INSERT INTO fact
|
|
||||||
std::vector<obelisk::Fact> facts {fact};
|
std::vector<obelisk::Fact> facts {fact};
|
||||||
kb->addFacts(facts);
|
kb->addFacts(facts);
|
||||||
fact = facts.front();
|
fact = facts.front();
|
||||||
|
|
||||||
|
if (fact.getId() == 0)
|
||||||
|
{
|
||||||
|
kb->getFact(fact);
|
||||||
|
if (fact.getId() == 0)
|
||||||
|
{
|
||||||
|
throw obelisk::ParserException(
|
||||||
|
"fact could not be inserted into the database");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user