diff options
Diffstat (limited to 'src/parser.lua')
| -rw-r--r-- | src/parser.lua | 66 |
1 files changed, 35 insertions, 31 deletions
diff --git a/src/parser.lua b/src/parser.lua index c36baf3..ffcca71 100644 --- a/src/parser.lua +++ b/src/parser.lua @@ -130,6 +130,26 @@ local function updateffp (name) return Cmt(Carg(1) * Cc(name), setffp) end +--Fixes strings +local function fix_str (str) + --print("I need to fix string:" .. str) + --print("attempt:" .. string.format("%q",str)) + str = string.gsub(str, "\\a", "\a") + str = string.gsub(str, "\\b", "\b") + str = string.gsub(str, "\\f", "\f") + str = string.gsub(str, "\\n", "\n") + str = string.gsub(str, "\\r", "\r") + str = string.gsub(str, "\\t", "\t") + str = string.gsub(str, "\\v", "\v") + str = string.gsub(str, "\\\n", "\n") + str = string.gsub(str, "\\\r", "\n") + str = string.gsub(str, "\\'", "'") + str = string.gsub(str, '\\"', '"') + str = string.gsub(str, '\\\\', '\\') + --print("actual:" .. str) + return str +end + -- regular combinators and auxiliary functions local function token (pat, name) @@ -192,33 +212,17 @@ local function chainl1 (pat, sep) end local function sepby (pat, sep, tag) - return taggedCap(tag, (pat * (sep * pat)^0)^-1) + return taggedCap(tag, (pat * (sep * pat)^0)^(-1)) end local function sepby1 (pat, sep, tag) return taggedCap(tag, pat * (sep * pat)^0) end -local function fix_str (str) - str = string.gsub(str, "\\a", "\a") - str = string.gsub(str, "\\b", "\b") - str = string.gsub(str, "\\f", "\f") - str = string.gsub(str, "\\n", "\n") - str = string.gsub(str, "\\r", "\r") - str = string.gsub(str, "\\t", "\t") - str = string.gsub(str, "\\v", "\v") - str = string.gsub(str, "\\\n", "\n") - str = string.gsub(str, "\\\r", "\n") - str = string.gsub(str, "\\'", "'") - str = string.gsub(str, '\\"', '"') - str = string.gsub(str, '\\\\', '\\') - return str -end - -- grammar local G = { V"Lua", - Lua = V"Shebang"^-1 * V"Skip" * V"Chunk" * -1 + report_error(); + Lua = V"Shebang"^(-1) * V"Skip" * V"Chunk" * -1 + report_error(); -- parser Chunk = V"Block"; StatList = (symb(";") + V"Stat")^0; @@ -229,11 +233,11 @@ local G = { V"Lua", Field = taggedCap("Pair", (symb("[") * V"Expr" * symb("]") * symb("=") * V"Expr") + (taggedCap("String", token(V"Name", "Name")) * symb("=") * V"Expr")) + V"Expr"; - FieldList = (V"Field" * (V"FieldSep" * V"Field")^0 * V"FieldSep"^-1)^-1; + FieldList = (V"Field" * (V"FieldSep" * V"Field")^0 * V"FieldSep"^(-1))^(-1); Constructor = taggedCap("Table", symb("{") * V"FieldList" * symb("}")); NameList = sepby1(V"Id", symb(","), "NameList"); ExpList = sepby1(V"Expr", symb(","), "ExpList"); - FuncArgs = symb("(") * (V"Expr" * (symb(",") * V"Expr")^0)^-1 * symb(")") + + FuncArgs = symb("(") * (V"Expr" * (symb(",") * V"Expr")^0)^(-1) * symb(")") + V"Constructor" + taggedCap("String", token(V"String", "String")); Expr = V"SubExpr_1"; @@ -250,7 +254,7 @@ local G = { V"Lua", SubExpr_10 = chainl1(V"SubExpr_11", V"MulOp"); SubExpr_11 = V"UnOp" * V"SubExpr_11" / unaryop + V"SubExpr_12"; - SubExpr_12 = V"SimpleExp" * (V"PowOp" * V"SubExpr_11")^-1 / binaryop; + SubExpr_12 = V"SimpleExp" * (V"PowOp" * V"SubExpr_11")^(-1) / binaryop; SimpleExp = taggedCap("Number", token(V"Number", "Number")) + taggedCap("String", token(V"String", "String")) + taggedCap("Nil", kw("nil")) + @@ -281,11 +285,11 @@ local G = { V"Lua", end); PrimaryExp = V"Var" + taggedCap("Paren", symb("(") * V"Expr" * symb(")")); - Block = taggedCap("Block", V"StatList" * V"RetStat"^-1); + Block = taggedCap("Block", V"StatList" * V"RetStat"^(-1)); IfStat = taggedCap("If", kw("if") * V"Expr" * kw("then") * V"Block" * (kw("elseif") * V"Expr" * kw("then") * V"Block")^0 * - (kw("else") * V"Block")^-1 * + (kw("else") * V"Block")^(-1) * kw("end")); WhileStat = taggedCap("While", kw("while") * V"Expr" * kw("do") * V"Block" * kw("end")); @@ -297,7 +301,7 @@ local G = { V"Lua", ForBody = kw("do") * V"Block"; ForNum = taggedCap("Fornum", V"Id" * symb("=") * V"Expr" * symb(",") * - V"Expr" * (symb(",") * V"Expr")^-1 * + V"Expr" * (symb(",") * V"Expr")^(-1) * V"ForBody"); ForGen = taggedCap("Forin", V"NameList" * kw("in") * V"ExpList" * V"ForBody"); ForStat = kw("for") * (V"ForNum" + V"ForGen") * kw("end"); @@ -309,14 +313,14 @@ local G = { V"Lua", return {tag = "Index", pos = t1.pos, [1] = t1, [2] = t2} end return t1 - end) * (symb(":") * taggedCap("String", token(V"Name", "Name")))^-1 / + end) * (symb(":") * taggedCap("String", token(V"Name", "Name")))^(-1) / function (t1, t2) if t2 then return {tag = "Index", pos = t1.pos, is_method = true, [1] = t1, [2] = t2} end return t1 end; - ParList = V"NameList" * (symb(",") * symb("...") * taggedCap("Dots", Cp()))^-1 / + ParList = V"NameList" * (symb(",") * symb("...") * taggedCap("Dots", Cp()))^(-1) / function (t, v) if v then table.insert(t, v) end return t @@ -349,7 +353,7 @@ local G = { V"Lua", BreakStat = taggedCap("Break", kw("break")); ContinueStat = taggedCap("Continue", kw("continue")); GoToStat = taggedCap("Goto", kw("goto") * token(V"Name", "Name")); - RetStat = taggedCap("Return", kw("return") * (V"Expr" * (symb(",") * V"Expr")^0)^-1 * symb(";")^-1); + RetStat = taggedCap("Return", kw("return") * (V"Expr" * (symb(",") * V"Expr")^0)^(-1) * symb(";")^(-1)); ExprStat = Cmt( (V"SuffixedExp" * (Cc(function (...) @@ -379,14 +383,14 @@ local G = { V"Lua", return false end))) , function (s, i, s1, f, ...) return f(s1, ...) end); - Assignment = ((symb(",") * V"SuffixedExp")^1)^-1 * symb("=") * V"ExpList"; + Assignment = ((symb(",") * V"SuffixedExp")^1)^(-1) * symb("=") * V"ExpList"; Stat = V"IfStat" + V"WhileStat" + V"DoStat" + V"ForStat" + V"RepeatStat" + V"FuncStat" + V"LocalStat" + V"LabelStat" + V"BreakStat" + V"GoToStat" + V"ExprStat" + V"ContinueStat"; -- lexer Space = space^1; Equals = P"="^0; - Open = "[" * Cg(V"Equals", "init") * "[" * P"\n"^-1; + Open = "[" * Cg(V"Equals", "init") * "[" * P"\n"^(-1); Close = "]" * C(V"Equals") * "]"; CloseEQ = Cmt(V"Close" * Cb("init"), function (s, i, a, b) return a == b end); @@ -407,9 +411,9 @@ local G = { V"Lua", Identifier = V"idStart" * V"idRest"^0; Name = -V"Reserved" * C(V"Identifier") * -V"idRest"; Hex = (P("0x") + P("0X")) * xdigit^1; - Expo = S("eE") * S("+-")^-1 * digit^1; + Expo = S("eE") * S("+-")^(-1) * digit^1; Float = (((digit^1 * P(".") * digit^0) + - (P(".") * digit^1)) * V"Expo"^-1) + + (P(".") * digit^1)) * V"Expo"^(-1)) + (digit^1 * V"Expo"); Int = digit^1; Number = C(V"Hex" + V"Float" + V"Int") / |
