diff options
Diffstat (limited to 'examples/tiny.lua')
-rw-r--r-- | examples/tiny.lua | 84 |
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 @@ | |||
1 | local re = require 'relabel' | 1 | local re = require 'relabelrec' |
2 | 2 | ||
3 | local terror = {} | 3 | local terror = {} |
4 | 4 | ||
@@ -25,21 +25,6 @@ newError("errFactor", "Error: expected '(', ID, or number after '*' or '/'") | |||
25 | newError("errExpFac", "Error: expected expression after '('") | 25 | newError("errExpFac", "Error: expected expression after '('") |
26 | newError("errClosePar", "Error: expected ')' after expression") | 26 | newError("errClosePar", "Error: expected ')' after expression") |
27 | 27 | ||
28 | local line | ||
29 | |||
30 | local function incLine() | ||
31 | line = line + 1 | ||
32 | return true | ||
33 | end | ||
34 | |||
35 | local 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 | ||
42 | end | ||
43 | 28 | ||
44 | local labelCode = {} | 29 | local labelCode = {} |
45 | for k, v in ipairs(terror) do | 30 | for k, v in ipairs(terror) do |
@@ -48,7 +33,7 @@ end | |||
48 | 33 | ||
49 | re.setlabels(labelCode) | 34 | re.setlabels(labelCode) |
50 | 35 | ||
51 | local g = re.compile([[ | 36 | local 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 | ||
108 | local function printError(n, e) | 92 | local 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 | ||
111 | end | 100 | end |
112 | 101 | ||
113 | local s = [[ | 102 | local s = [[ |
@@ -118,7 +107,7 @@ repeat | |||
118 | n := n - 1 | 107 | n := n - 1 |
119 | until (n < 1); | 108 | until (n < 1); |
120 | write f;]] | 109 | write f;]] |
121 | printError(g:match(s)) | 110 | print(mymatch(g, s)) |
122 | 111 | ||
123 | s = [[ | 112 | s = [[ |
124 | n := 5; | 113 | n := 5; |
@@ -128,14 +117,14 @@ repeat | |||
128 | n := n - 1; | 117 | n := n - 1; |
129 | until (n < 1); | 118 | until (n < 1); |
130 | read ;]] | 119 | read ;]] |
131 | printError(g:match(s)) | 120 | print(mymatch(g, s)) |
132 | 121 | ||
133 | s = [[ | 122 | s = [[ |
134 | if a < 1 then | 123 | if a < 1 then |
135 | b := 2; | 124 | b := 2; |
136 | else | 125 | else |
137 | b := 3;]] | 126 | b := 3;]] |
138 | printError(g:match(s)) | 127 | print(mymatch(g, s)) |
139 | 128 | ||
140 | s = [[ | 129 | s = [[ |
141 | n := 5; | 130 | n := 5; |
@@ -145,7 +134,7 @@ repeat | |||
145 | n := n - 1; | 134 | n := n - 1; |
146 | untill (n < 1); | 135 | untill (n < 1); |
147 | ]] | 136 | ]] |
148 | printError(g:match(s)) | 137 | print(mymatch(g, s)) |
149 | 138 | ||
150 | s = [[ | 139 | s = [[ |
151 | n := 5; | 140 | n := 5; |
@@ -155,9 +144,8 @@ repeat | |||
155 | n := n - 1; | 144 | n := n - 1; |
156 | 3 (n < 1); | 145 | 3 (n < 1); |
157 | ]] | 146 | ]] |
158 | printError(g:match(s)) | 147 | print(mymatch(g, s)) |
159 | |||
160 | printError(g:match("a : 2")) | ||
161 | printError(g:match("a := (2")) | ||
162 | 148 | ||
149 | print(mymatch(g, "a : 2")) | ||
150 | print(mymatch(g, "a := (2")) | ||
163 | 151 | ||