Commit 53408236 authored by twanvl's avatar twanvl

non-fatal warnings in script parser

parent 13526524
...@@ -410,16 +410,16 @@ ScriptP parse(const String& s, Packaged* package, bool string_mode, vector<Scrip ...@@ -410,16 +410,16 @@ ScriptP parse(const String& s, Packaged* package, bool string_mode, vector<Scrip
// parse // parse
TokenIterator input(s, package, string_mode, errors_out); TokenIterator input(s, package, string_mode, errors_out);
ScriptP script(new Script); ScriptP script(new Script);
parseOper(input, *script, PREC_ALL); ExprType type = parseOper(input, *script, PREC_ALL);
Token eof = input.read(); Token eof = input.read();
if (eof != TOK_EOF) { if (eof != TOK_EOF) {
input.expected(_("end of input")); input.expected(_("end of input"));
} }
// were there errors? // were there fatal errors?
if (errors_out.empty()) { if (type == EXPR_FAILED) {
return script;
} else {
return ScriptP(); return ScriptP();
} else {
return script;
} }
} }
...@@ -504,14 +504,15 @@ ExprType parseExpr(TokenIterator& input, Script& script, Precedence minPrec) { ...@@ -504,14 +504,15 @@ ExprType parseExpr(TokenIterator& input, Script& script, Precedence minPrec) {
unsigned jmpEnd = script.addInstruction(I_JUMP); // jump lbl_end unsigned jmpEnd = script.addInstruction(I_JUMP); // jump lbl_end
script.comeFrom(jmpElse); // lbl_else: script.comeFrom(jmpElse); // lbl_else:
bool has_else = input.peek() == _("else"); //else bool has_else = input.peek() == _("else"); //else
ExprType type = EXPR_STATEMENT;
if (has_else) { if (has_else) {
input.read(); input.read();
parseOper(input, script, PREC_SET); // CCC type = parseOper(input, script, PREC_SET); // CCC
} else { } else {
script.addInstruction(I_PUSH_CONST, script_nil); script.addInstruction(I_PUSH_CONST, script_nil);
} }
script.comeFrom(jmpEnd); // lbl_end: script.comeFrom(jmpEnd); // lbl_end:
return has_else ? EXPR_OTHER : EXPR_STATEMENT; return type == EXPR_STATEMENT ? EXPR_STATEMENT : EXPR_OTHER;
} else if (token == _("for")) { } else if (token == _("for")) {
// the loop body should have a net stack effect of 0, but the entire expression of +1 // the loop body should have a net stack effect of 0, but the entire expression of +1
// solution: add all results from the body, start with nil // solution: add all results from the body, start with nil
...@@ -526,6 +527,7 @@ ExprType parseExpr(TokenIterator& input, Script& script, Precedence minPrec) { ...@@ -526,6 +527,7 @@ ExprType parseExpr(TokenIterator& input, Script& script, Precedence minPrec) {
Token name = input.read(); // AAA Token name = input.read(); // AAA
if (name != TOK_NAME) { if (name != TOK_NAME) {
input.expected(_("name")); input.expected(_("name"));
return EXPR_FAILED;
} }
Variable var = string_to_variable(name.value); Variable var = string_to_variable(name.value);
// key:value? // key:value?
...@@ -536,6 +538,7 @@ ExprType parseExpr(TokenIterator& input, Script& script, Precedence minPrec) { ...@@ -536,6 +538,7 @@ ExprType parseExpr(TokenIterator& input, Script& script, Precedence minPrec) {
name = input.read(); // BBB name = input.read(); // BBB
if (name != TOK_NAME) { if (name != TOK_NAME) {
input.expected(_("name")); input.expected(_("name"));
return EXPR_FAILED;
} }
key = string_to_variable(name.value); key = string_to_variable(name.value);
swap(var,key); swap(var,key);
...@@ -684,9 +687,13 @@ ExprType parseOper(TokenIterator& input, Script& script, Precedence minPrec, Ins ...@@ -684,9 +687,13 @@ ExprType parseOper(TokenIterator& input, Script& script, Precedence minPrec, Ins
Instruction& instr = script.getInstructions().back(); Instruction& instr = script.getInstructions().back();
if (type != EXPR_VAR || instr.instr != I_GET_VAR) { if (type != EXPR_VAR || instr.instr != I_GET_VAR) {
input.add_error(_("Can only assign to variables")); input.add_error(_("Can only assign to variables"));
return EXPR_FAILED;
} }
script.getInstructions().pop_back(); script.getInstructions().pop_back();
parseOper(input, script, PREC_SET, I_SET_VAR, instr.data); type = parseOper(input, script, PREC_SET, I_SET_VAR, instr.data);
if (type == EXPR_STATEMENT) {
input.add_error(_("Warning: the right hand side of an assignment should always yield a value."));
}
} }
else if (minPrec <= PREC_AND && token==_("orelse"))parseOper(input, script, PREC_ADD, I_BINARY, I_OR_ELSE); else if (minPrec <= PREC_AND && token==_("orelse"))parseOper(input, script, PREC_ADD, I_BINARY, I_OR_ELSE);
else if (minPrec <= PREC_AND && token==_("and")) { else if (minPrec <= PREC_AND && token==_("and")) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment