aboutsummaryrefslogtreecommitdiff
path: root/examples/tiny.lua
diff options
context:
space:
mode:
Diffstat (limited to 'examples/tiny.lua')
-rw-r--r--examples/tiny.lua84
1 files changed, 36 insertions, 48 deletions
diff --git a/examples/tiny.lua b/examples/tiny.lua
index 99c3144..784e031 100644
--- a/examples/tiny.lua
+++ b/examples/tiny.lua
@@ -1,4 +1,4 @@
1local re = require 'relabel' 1local re = require 'relabelrec'
2 2
3local terror = {} 3local terror = {}
4 4
@@ -25,21 +25,6 @@ newError("errFactor", "Error: expected '(', ID, or number after '*' or '/'")
25newError("errExpFac", "Error: expected expression after '('") 25newError("errExpFac", "Error: expected expression after '('")
26newError("errClosePar", "Error: expected ')' after expression") 26newError("errClosePar", "Error: expected ')' after expression")
27 27
28local line
29
30local function incLine()
31 line = line + 1
32 return true
33end
34
35local function countLine(s, i)
36 line = 1
37 local p = re.compile([[
38 S <- (%nl -> incLine / .)*
39 ]], { incLine = incLine})
40 p:match(s:sub(1, i))
41 return true
42end
43 28
44local labelCode = {} 29local labelCode = {}
45for k, v in ipairs(terror) do 30for k, v in ipairs(terror) do
@@ -48,7 +33,7 @@ end
48 33
49re.setlabels(labelCode) 34re.setlabels(labelCode)
50 35
51local g = re.compile([[ 36local g = re.compile[[
52 Tiny <- CmdSeq 37 Tiny <- CmdSeq
53 CmdSeq <- (Cmd (SEMICOLON / ErrSemi)) (Cmd (SEMICOLON / ErrSemi))* 38 CmdSeq <- (Cmd (SEMICOLON / ErrSemi)) (Cmd (SEMICOLON / ErrSemi))*
54 Cmd <- IfCmd / RepeatCmd / ReadCmd / WriteCmd / AssignCmd 39 Cmd <- IfCmd / RepeatCmd / ReadCmd / WriteCmd / AssignCmd
@@ -61,25 +46,24 @@ local g = re.compile([[
61 SimpleExp <- Term ((ADD / SUB) (Term / ErrTerm))* 46 SimpleExp <- Term ((ADD / SUB) (Term / ErrTerm))*
62 Term <- Factor ((MUL / DIV) (Factor / ErrFactor))* 47 Term <- Factor ((MUL / DIV) (Factor / ErrFactor))*
63 Factor <- OPENPAR (Exp / ErrExpFac) (CLOSEPAR / ErrClosePar) / NUMBER / NAME 48 Factor <- OPENPAR (Exp / ErrExpFac) (CLOSEPAR / ErrClosePar) / NUMBER / NAME
64 ErrSemi <- ErrCount %{errSemi} 49 ErrSemi <- %{errSemi}
65 ErrExpIf <- ErrCount %{errExpIf} 50 ErrExpIf <- %{errExpIf}
66 ErrThen <- ErrCount %{errThen} 51 ErrThen <- %{errThen}
67 ErrCmdSeq1 <- ErrCount %{errCmdSeq1} 52 ErrCmdSeq1 <- %{errCmdSeq1}
68 ErrCmdSeq2 <- ErrCount %{errCmdSeq2} 53 ErrCmdSeq2 <- %{errCmdSeq2}
69 ErrEnd <- ErrCount %{errEnd} 54 ErrEnd <- %{errEnd}
70 ErrCmdSeqRep <- ErrCount %{errCmdSeqRep} 55 ErrCmdSeqRep <- %{errCmdSeqRep}
71 ErrUntil <- ErrCount %{errUntil} 56 ErrUntil <- %{errUntil}
72 ErrExpRep <- ErrCount %{errExpRep} 57 ErrExpRep <- %{errExpRep}
73 ErrAssignOp <- ErrCount %{errAssignOp} 58 ErrAssignOp <- %{errAssignOp}
74 ErrExpAssign <- ErrCount %{errExpAssign} 59 ErrExpAssign <- %{errExpAssign}
75 ErrReadName <- ErrCount %{errReadName} 60 ErrReadName <- %{errReadName}
76 ErrWriteExp <- ErrCount %{errWriteExp} 61 ErrWriteExp <- %{errWriteExp}
77 ErrSimpExp <- ErrCount %{errSimpExp} 62 ErrSimpExp <- %{errSimpExp}
78 ErrTerm <- ErrCount %{errTerm} 63 ErrTerm <- %{errTerm}
79 ErrFactor <- ErrCount %{errFactor} 64 ErrFactor <- %{errFactor}
80 ErrExpFac <- ErrCount %{errExpFac} 65 ErrExpFac <- %{errExpFac}
81 ErrClosePar <- ErrCount %{errClosePar} 66 ErrClosePar <- %{errClosePar}
82 ErrCount <- '' => countLine
83 ADD <- Sp '+' 67 ADD <- Sp '+'
84 ASSIGNMENT <- Sp ':=' 68 ASSIGNMENT <- Sp ':='
85 CLOSEPAR <- Sp ')' 69 CLOSEPAR <- Sp ')'
@@ -102,12 +86,17 @@ local g = re.compile([[
102 WRITE <- Sp 'write' 86 WRITE <- Sp 'write'
103 RESERVED <- (IF / ELSE / END / READ / REPEAT / THEN / UNTIL / WRITE) ![a-z]+ 87 RESERVED <- (IF / ELSE / END / READ / REPEAT / THEN / UNTIL / WRITE) ![a-z]+
104 Sp <- %s* 88 Sp <- %s*
105]], { countLine = countLine }) 89]]
106 90
107 91
108local function printError(n, e) 92local function mymatch(g, s)
109 assert(n == nil) 93 local r, e, sfail = g:match(s)
110 print("Line " .. line .. ": " .. terror[e].msg) 94 if not r then
95 local line, col = re.calcline(s, #s - #sfail)
96 local msg = "Error at line " .. line .. " (col " .. col .. "): "
97 return r, msg .. terror[e].msg
98 end
99 return r
111end 100end
112 101
113local s = [[ 102local s = [[
@@ -118,7 +107,7 @@ repeat
118 n := n - 1 107 n := n - 1
119until (n < 1); 108until (n < 1);
120write f;]] 109write f;]]
121printError(g:match(s)) 110print(mymatch(g, s))
122 111
123s = [[ 112s = [[
124n := 5; 113n := 5;
@@ -128,14 +117,14 @@ repeat
128 n := n - 1; 117 n := n - 1;
129until (n < 1); 118until (n < 1);
130read ;]] 119read ;]]
131printError(g:match(s)) 120print(mymatch(g, s))
132 121
133s = [[ 122s = [[
134if a < 1 then 123if a < 1 then
135 b := 2; 124 b := 2;
136else 125else
137 b := 3;]] 126 b := 3;]]
138printError(g:match(s)) 127print(mymatch(g, s))
139 128
140s = [[ 129s = [[
141n := 5; 130n := 5;
@@ -145,7 +134,7 @@ repeat
145 n := n - 1; 134 n := n - 1;
146untill (n < 1); 135untill (n < 1);
147]] 136]]
148printError(g:match(s)) 137print(mymatch(g, s))
149 138
150s = [[ 139s = [[
151n := 5; 140n := 5;
@@ -155,9 +144,8 @@ repeat
155 n := n - 1; 144 n := n - 1;
1563 (n < 1); 1453 (n < 1);
157]] 146]]
158printError(g:match(s)) 147print(mymatch(g, s))
159
160printError(g:match("a : 2"))
161printError(g:match("a := (2"))
162 148
149print(mymatch(g, "a : 2"))
150print(mymatch(g, "a := (2"))
163 151