aboutsummaryrefslogtreecommitdiff
path: root/src/parser.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.lua')
-rw-r--r--src/parser.lua66
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") /