From a949129c2f3d24c7614093376083082f5beb83da Mon Sep 17 00:00:00 2001 From: Andre Murbach Maidl Date: Wed, 7 Oct 2015 17:39:13 -0300 Subject: Adding labels and messages for malformed expressions --- examples/typedlua/test.lua | 10 +++++----- examples/typedlua/tlerror.lua | 14 ++++++++++++++ examples/typedlua/tlparser.lua | 30 +++++++++++++++--------------- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/examples/typedlua/test.lua b/examples/typedlua/test.lua index ffdbd70..aa78856 100755 --- a/examples/typedlua/test.lua +++ b/examples/typedlua/test.lua @@ -1757,7 +1757,7 @@ a = 3 / / 2 test.lua:1:9: syntax error, unexpected '/', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' ]=] e = [=[ -test.lua:1:9: unexpected '/', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' +test.lua:1:9: malformed multiplication expression ]=] r, m = parse(s) @@ -1772,7 +1772,7 @@ b = 1 && 1 test.lua:1:8: syntax error, unexpected '&', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' ]=] e = [=[ -test.lua:1:8: unexpected '&', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' +test.lua:1:8: malformed '&' expression ]=] r, m = parse(s) @@ -1785,7 +1785,7 @@ b = 1 <> 0 test.lua:1:8: syntax error, unexpected '>', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' ]=] e = [=[ -test.lua:1:8: unexpected '>', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' +test.lua:1:8: malformed relational expression ]=] r, m = parse(s) @@ -1798,7 +1798,7 @@ b = 1 < < 0 test.lua:1:9: syntax error, unexpected '<', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' ]=] e = [=[ -test.lua:1:9: unexpected '<', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' +test.lua:1:9: malformed relational expression ]=] r, m = parse(s) @@ -1973,7 +1973,7 @@ end test.lua:7:1: syntax error, unexpected 'end', expecting '(', 'Name', '{', 'function', '...', 'true', 'false', 'nil', 'String', 'Number', '#', '~', '-', 'not' ]=] e = [=[ -test.lua:7:1: missing 'end' to close if statement +test.lua:7:1: expecting after 'elseif' ]=] r, m = parse(s) diff --git a/examples/typedlua/tlerror.lua b/examples/typedlua/tlerror.lua index 6881b6b..c51a53b 100644 --- a/examples/typedlua/tlerror.lua +++ b/examples/typedlua/tlerror.lua @@ -38,6 +38,20 @@ new_error("Label2", "expecting '::' to close label declaration") new_error("LocalAssign", "expecting expression list after '='") new_error("ForGen", "expecting 'in'") new_error("LocalFunc", "expecting in local function declaration") +new_error("Exp", "malformed expression") +new_error("ElseIf", "expecting after 'elseif'") +new_error("SubExpr_1", "malformed 'or' expression") +new_error("SubExpr_2", "malformed 'and' expression") +new_error("SubExpr_3", "malformed relational expression") +new_error("SubExpr_4", "malformed '|' expression") +new_error("SubExpr_5", "malformed '~' expression") +new_error("SubExpr_6", "malformed '&' expression") +new_error("SubExpr_7", "malformed shift expression") +new_error("SubExpr_8", "malformed '..' expression") +new_error("SubExpr_9", "malformed addition expression") +new_error("SubExpr_10", "malformed multiplication expression") +new_error("SubExpr_11", "malformed unary expression") +new_error("SubExpr_12", "malformed '^' expression") local labels = {} for k, v in ipairs(errors) do diff --git a/examples/typedlua/tlparser.lua b/examples/typedlua/tlparser.lua index 2180812..67a06a4 100644 --- a/examples/typedlua/tlparser.lua +++ b/examples/typedlua/tlparser.lua @@ -7,7 +7,7 @@ local tllexer = require "tllexer" local tlerror = require "tlerror" local function chainl1 (pat, sep, label) - return pat * (sep * pat)^0 + return pat * (sep * tllexer.try(pat, label))^0 end local G = lpeg.P { "TypedLua"; @@ -102,7 +102,7 @@ local G = lpeg.P { "TypedLua"; tllexer.symb("<") + tllexer.symb(">"); BOrOp = tllexer.symb("|"); - BXorOp = tllexer.symb("~"); + BXorOp = tllexer.symb("~") * -lpeg.P("="); BAndOp = tllexer.symb("&"); ShiftOp = tllexer.symb("<<") + tllexer.symb(">>"); @@ -119,20 +119,20 @@ local G = lpeg.P { "TypedLua"; tllexer.symb("#"); PowOp = tllexer.symb("^"); Expr = lpeg.V("SubExpr_1"); - SubExpr_1 = chainl1(lpeg.V("SubExpr_2"), lpeg.V("OrOp")); - SubExpr_2 = chainl1(lpeg.V("SubExpr_3"), lpeg.V("AndOp")); - SubExpr_3 = chainl1(lpeg.V("SubExpr_4"), lpeg.V("RelOp")); - SubExpr_4 = chainl1(lpeg.V("SubExpr_5"), lpeg.V("BOrOp")); - SubExpr_5 = chainl1(lpeg.V("SubExpr_6"), lpeg.V("BXorOp")); - SubExpr_6 = chainl1(lpeg.V("SubExpr_7"), lpeg.V("BAndOp")); - SubExpr_7 = chainl1(lpeg.V("SubExpr_8"), lpeg.V("ShiftOp")); - SubExpr_8 = lpeg.V("SubExpr_9") * lpeg.V("ConOp") * lpeg.V("SubExpr_8") + + SubExpr_1 = chainl1(lpeg.V("SubExpr_2"), lpeg.V("OrOp"), "SubExpr_1"); + SubExpr_2 = chainl1(lpeg.V("SubExpr_3"), lpeg.V("AndOp"), "SubExpr_2"); + SubExpr_3 = chainl1(lpeg.V("SubExpr_4"), lpeg.V("RelOp"), "SubExpr_3"); + SubExpr_4 = chainl1(lpeg.V("SubExpr_5"), lpeg.V("BOrOp"), "SubExpr_4"); + SubExpr_5 = chainl1(lpeg.V("SubExpr_6"), lpeg.V("BXorOp"), "SubExpr_5"); + SubExpr_6 = chainl1(lpeg.V("SubExpr_7"), lpeg.V("BAndOp"), "SubExpr_6"); + SubExpr_7 = chainl1(lpeg.V("SubExpr_8"), lpeg.V("ShiftOp"), "SubExpr_7"); + SubExpr_8 = lpeg.V("SubExpr_9") * lpeg.V("ConOp") * tllexer.try(lpeg.V("SubExpr_8"), "SubExpr_8") + lpeg.V("SubExpr_9"); - SubExpr_9 = chainl1(lpeg.V("SubExpr_10"), lpeg.V("AddOp")); - SubExpr_10 = chainl1(lpeg.V("SubExpr_11"), lpeg.V("MulOp")); - SubExpr_11 = lpeg.V("UnOp") * lpeg.V("SubExpr_11") + + SubExpr_9 = chainl1(lpeg.V("SubExpr_10"), lpeg.V("AddOp"), "SubExpr_9"); + SubExpr_10 = chainl1(lpeg.V("SubExpr_11"), lpeg.V("MulOp"), "SubExpr_10"); + SubExpr_11 = lpeg.V("UnOp") * tllexer.try(lpeg.V("SubExpr_11"), "SubExpr_11") + lpeg.V("SubExpr_12"); - SubExpr_12 = lpeg.V("SimpleExp") * (lpeg.V("PowOp") * lpeg.V("SubExpr_11"))^-1; + SubExpr_12 = lpeg.V("SimpleExp") * (lpeg.V("PowOp") * tllexer.try(lpeg.V("SubExpr_11"), "SubExpr_12"))^-1; SimpleExp = tllexer.token(tllexer.Number, "Number") + tllexer.token(tllexer.String, "String") + tllexer.kw("nil") + @@ -151,7 +151,7 @@ local G = lpeg.P { "TypedLua"; tllexer.symb("(") * lpeg.V("Expr") * tllexer.try(tllexer.symb(")"), "MissingCP"); Block = lpeg.V("StatList") * lpeg.V("RetStat")^-1; IfStat = tllexer.kw("if") * lpeg.V("Expr") * tllexer.try(tllexer.kw("then"), "Then") * lpeg.V("Block") * - (tllexer.kw("elseif") * lpeg.V("Expr") * tllexer.try(tllexer.kw("then"), "Then") * lpeg.V("Block"))^0 * + (tllexer.kw("elseif") * tllexer.try(lpeg.V("Expr"), "ElseIf") * tllexer.try(tllexer.kw("then"), "Then") * lpeg.V("Block"))^0 * (tllexer.kw("else") * lpeg.V("Block"))^-1 * tllexer.try(tllexer.kw("end"), "IfEnd"); WhileStat = tllexer.kw("while") * lpeg.V("Expr") * -- cgit v1.2.3-55-g6feb