Fix test regression: incomplete errors no longer cause var parsing to fail
diff --git a/Parser.cpp b/Parser.cpp
index 2c62f27..41f6727 100644
--- a/Parser.cpp
+++ b/Parser.cpp
@@ -13,7 +13,7 @@
ParseResult::ParseResult(int status, QString message, ParsePos pos)
{
_status = status;
- _message = message;
+ _message = message;
_pos = pos;
}
@@ -37,14 +37,6 @@
return _status;
}
-ParseResult ParseResult::operator ||(const ParseResult &other) const
-{
- if (_status == COMPLETE || _status == INCOMPLETE)
- return *this;
- else
- return other;
-}
-
Parser::Parser(QString input)
{
_input = input;
@@ -86,6 +78,11 @@
get();
}
+QString Parser::line(int n) const
+{
+ return _input.split("\n")[n];
+}
+
ParsePos Parser::save() const
{
return ParsePos{_line, _pos, _offset};
@@ -183,7 +180,7 @@
{
ParseResult ret(ParseResult::INCOMPLETE,
"Expected identifier or symbol after . in variable",
- pos);
+ save());
reset(pos);
@@ -262,8 +259,9 @@
AstNode head;
if (!(ret = parseIdentifier(&head)))
{
+ ParsePos endPos = save();
reset(pos);
- return ret;
+ return ParseResult(ParseResult::INCOMPLETE, "Expected identifier following < in function call", endPos);
}
QList<AstNode> body;
@@ -293,22 +291,35 @@
template <>
ParseResult Parser::parseOne<Token>(Token *node)
{
- return parseVariable(node) ||
- parseNumber(node) ||
- parseIdentifier(node) ||
- parseSymbol(node) ||
- parseParens(node);
+ ParseResult ret;
+
+ if ((ret = parseVariable(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseNumber(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseIdentifier(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseSymbol(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ return parseParens(node);
}
template <>
ParseResult Parser::parseOne<AstNode>(AstNode *node)
{
- return parseFunction(node) ||
- parseVariable(node) ||
- parseNumber(node) ||
- parseIdentifier(node) ||
- parseSymbol(node) ||
- parseParens(node);
+ ParseResult ret;
+
+ if ((ret = parseFunction(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseVariable(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseNumber(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseIdentifier(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ if ((ret = parseSymbol(node)).status() == ParseResult::COMPLETE || ret.status() == ParseResult::INCOMPLETE)
+ return ret;
+ return parseParens(node);
}
ParseResult Parser::parseSentence(Sentence *sentence)
@@ -391,7 +402,7 @@
skip();
}
- if (ret.status() == ParseResult::INCOMPLETE)
+ if (ret.status() == ParseResult::INCOMPLETE)
{
reset(pos);
return ret;
@@ -399,7 +410,7 @@
if (get() != '}')
{
- ret = ParseResult(ParseResult::INCOMPLETE, "Expected } at end of function");
+ ret = ParseResult(ParseResult::INCOMPLETE, "Expected } at end of function", save());
reset(pos);
return ret;
}
@@ -407,3 +418,8 @@
*function = func;
return true;
}
+
+ParsePos::operator QString()
+{
+ return QString::number(line) + ":" + QString::number(lineOffset);
+}