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);
+}