49 def | (s: Rexp) = ALT(r, s) |
49 def | (s: Rexp) = ALT(r, s) |
50 def % = STAR(r) |
50 def % = STAR(r) |
51 def ~ (s: Rexp) = SEQ(r, s) |
51 def ~ (s: Rexp) = SEQ(r, s) |
52 } |
52 } |
53 |
53 |
54 // to use & for records, instead of $ which had |
|
55 // its precedence be changed in Scala 3 |
|
56 |
|
57 val TEST = ("ab" | "ba").% |
54 val TEST = ("ab" | "ba").% |
58 |
55 |
59 def nullable(r: Rexp) : Boolean = r match { |
56 def nullable(r: Rexp) : Boolean = r match { |
60 case ZERO => false |
57 case ZERO => false |
61 case ONE => true |
58 case ONE => true |
146 |
143 |
147 println(lex(STAR("aa" | "a"), "aaa".toList)) |
144 println(lex(STAR("aa" | "a"), "aaa".toList)) |
148 |
145 |
149 println(lex(STAR(STAR("a")), "aaa".toList)) |
146 println(lex(STAR(STAR("a")), "aaa".toList)) |
150 |
147 |
151 val re = ("a" | "ab") ~ ("c" | "bc") |
|
152 |
|
153 println(pders1("abc", re).toList.mkString("\n")) |
|
154 pders('a', pder('a', re)))) |
|
155 draw(simp(der('a', der('a', der('a', re))))) |
|
156 |
|
157 size(simp(ders(, re))) |
|
158 size(simp(der('a', der('a', re)))) |
|
159 size(simp(der('a', der('a', der('a', re))))) |
|
160 |
|
161 |
|
162 lex(re, "aaaaa".toList) |
|
163 |
148 |
164 // The Lexing Rules for the WHILE Language |
149 // The Lexing Rules for the WHILE Language |
165 |
150 |
166 def PLUS(r: Rexp) = r ~ r.% |
151 def PLUS(r: Rexp) = r ~ r.% |
167 |
152 |
188 enum TAGS { |
173 enum TAGS { |
189 case Key, Id, Op, Num, Semi, Str, Paren, Wht |
174 case Key, Id, Op, Num, Semi, Str, Paren, Wht |
190 } |
175 } |
191 import TAGS._ |
176 import TAGS._ |
192 |
177 |
|
178 |
193 extension (t: TAGS) { |
179 extension (t: TAGS) { |
194 def & (r: Rexp) = RECD[TAGS](t, r) |
180 def $ (r: Rexp) = RECD[TAGS](t, r) |
195 } |
181 } |
196 |
182 |
197 def lexing(r: Rexp, s: String) = |
183 def lexing(r: Rexp, s: String) = |
198 env[TAGS](lex(r, s.toList)) |
184 env[TAGS](lex(r, s.toList)) |
199 |
185 |
200 val WHILE_REGS = ((Key & KEYWORD) | |
186 val WHILE_REGS = ((Key $ KEYWORD) | |
201 (Id & ID) | |
187 (Id $ ID) | |
202 (Op & OP) | |
188 (Op $ OP) | |
203 (Num & NUM) | |
189 (Num $ NUM) | |
204 (Semi & SEMI) | |
190 (Semi $ SEMI) | |
205 (Str & STRING) | |
191 (Str $ STRING) | |
206 (Paren & (LPAREN | RPAREN)) | |
192 (Paren $ (LPAREN | RPAREN)) | |
207 (Wht & WHITESPACE)).% |
193 (Wht $ WHITESPACE)).% |
208 |
194 |
209 |
195 |
210 // Two Simple While Tests |
196 // Two Simple While Tests |
211 //======================== |
197 //======================== |
212 |
198 |