|
| 1 | +require "builtins/bool.k" |
| 2 | +require "builtins/int.k" |
| 3 | + |
1 | 4 | module JS-ORIG-SYNTAX
|
2 | 5 |
|
| 6 | +imports BOOL-SYNTAX-HOOKS |
| 7 | +imports INT-SYNTAX-HOOKS |
| 8 | + |
3 | 9 | // Based on ECMA-262, 5.1 Edition, June 2011
|
4 | 10 |
|
5 | 11 | // A.5 Programs
|
@@ -214,109 +220,10 @@ syntax Expression ::= LeftExpression
|
214 | 220 | | LeftExpression "^=" Expression [right]
|
215 | 221 | | LeftExpression "|=" Expression [right]
|
216 | 222 |
|
217 |
| - |
218 |
| -// Utils |
219 |
| -syntax String ::= StringOfName(Name) [function, notInPrograms] |
220 |
| -rule StringOfName(N:Name) => #tokenToString(N) |
221 |
| -// |
222 |
| -syntax Name ::= NameOfString(String) [function, notInPrograms] |
223 |
| -rule NameOfString(S:String) => #parseToken("Name", S) |
224 |
| - |
225 |
| -syntax Float ::= "MyFloat2Float" "(" MyFloat ")" [function, notInPrograms] |
226 |
| -rule MyFloat2Float(F:MyFloat) => String2Float(#tokenToString(F)) |
227 |
| - |
228 |
| -syntax String ::= "MyString2String" "(" MyString ")" [function, notInPrograms] |
229 |
| -rule MyString2String(S:MyString) => processEscapes(processBackslashes(processQuotes(#tokenToString(S)))) |
230 |
| - |
231 |
| -syntax String ::= "processQuotes" "(" String ")" [function, notInPrograms] |
232 |
| -rule processQuotes(S:String) => replaceAll(substrString(S, 1, lengthString(S) -Int 1), "\\\"", "\"") when substrString(S,0,1) ==String "\"" |
233 |
| -rule processQuotes(S:String) => replaceAll(substrString(S, 1, lengthString(S) -Int 1), "\\'", "'") when substrString(S,0,1) ==String "'" |
234 |
| - |
235 |
| -syntax String ::= "processBackslashes" "(" String ")" [function, notInPrograms] |
236 |
| -rule processBackslashes(S:String) => substrString(S, 0, findString(S, "\\", 0)) +String processBackslashesAux(substrString(S, findString(S, "\\", 0), lengthString(S))) when findString(S, "\\", 0) =/=Int -1 |
237 |
| -rule processBackslashes(S:String) => S when findString(S, "\\", 0) ==Int -1 |
238 |
| - |
239 |
| -syntax String ::= "processBackslashesAux" "(" String ")" [function, notInPrograms] |
240 |
| -rule processBackslashesAux(S:String) => processBackslashesAuxAux(S) when lengthString(S) >Int 1 |
241 |
| -rule processBackslashesAux(S:String) => S when lengthString(S) ==Int 1 |
242 |
| - |
243 |
| -syntax String ::= "processBackslashesAuxAux" "(" String ")" [function, notInPrograms] |
244 |
| -rule processBackslashesAuxAux(S:String) => processBackslashes(substrString(S,1,lengthString(S))) when notBool(isEscapeChar(substrString(S,1,2))) |
245 |
| -rule processBackslashesAuxAux(S:String) => substrString(S,0,2) +String processBackslashes(substrString(S,2,lengthString(S))) when isEscapeChar(substrString(S,1,2)) |
246 |
| - |
247 |
| -syntax Bool ::= "isEscapeChar" "(" String ")" [function, notInPrograms] |
248 |
| -rule isEscapeChar(S:String) => S ==String "b" |
249 |
| - orBool S ==String "t" |
250 |
| - orBool S ==String "n" |
251 |
| - orBool S ==String "v" |
252 |
| - orBool S ==String "f" |
253 |
| - orBool S ==String "r" |
254 |
| - orBool S ==String "\\" |
255 |
| - // |
256 |
| - orBool S ==String "0" |
257 |
| - // |
258 |
| - orBool S ==String "\n" |
259 |
| - orBool S ==String "\r" |
260 |
| - orBool S ==String "\u2028" |
261 |
| - orBool S ==String "\u2029" |
262 |
| - // |
263 |
| - orBool S ==String "x" |
264 |
| - orBool S ==String "u" |
265 |
| - |
266 |
| -syntax String ::= "processEscapes" "(" String ")" [function, notInPrograms] |
267 |
| -rule processEscapes(S:String) => S when findString(S, "\\b" , 0) ==Int -1 |
268 |
| - andBool findString(S, "\\t" , 0) ==Int -1 |
269 |
| - andBool findString(S, "\\n" , 0) ==Int -1 |
270 |
| - andBool findString(S, "\\v" , 0) ==Int -1 |
271 |
| - andBool findString(S, "\\f" , 0) ==Int -1 |
272 |
| - andBool findString(S, "\\r" , 0) ==Int -1 |
273 |
| - andBool findString(S, "\\\\" , 0) ==Int -1 |
274 |
| - // |
275 |
| - andBool findString(S, "\\0" , 0) ==Int -1 |
276 |
| - // |
277 |
| - andBool findString(S, "\\\n" , 0) ==Int -1 |
278 |
| - andBool findString(S, "\\\r" , 0) ==Int -1 |
279 |
| - andBool findString(S, "\\\r\n" , 0) ==Int -1 |
280 |
| - andBool findString(S, "\\\u2028" , 0) ==Int -1 |
281 |
| - andBool findString(S, "\\\u2029" , 0) ==Int -1 |
282 |
| - // |
283 |
| - andBool findString(S, "\\x" , 0) ==Int -1 |
284 |
| - andBool findString(S, "\\u" , 0) ==Int -1 |
285 |
| -// \ [one of ' " \ b f n r t v] |
286 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\b" , "\u0008")) when findString(S, "\\b" , 0) =/=Int -1 |
287 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\t" , "\t" )) when findString(S, "\\t" , 0) =/=Int -1 |
288 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\n" , "\n" )) when findString(S, "\\n" , 0) =/=Int -1 |
289 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\v" , "\u000B")) when findString(S, "\\v" , 0) =/=Int -1 |
290 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\f" , "\f" )) when findString(S, "\\f" , 0) =/=Int -1 |
291 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\r" , "\r" )) when findString(S, "\\r" , 0) =/=Int -1 |
292 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\\\" , "\\" )) when findString(S, "\\\\" , 0) =/=Int -1 |
293 |
| -// \ 0 [lookahead \not\in DecimalDigit] |
294 |
| -// FIXME: check if lookahead is not a decimal degit. |
295 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\0" , "\u0000")) when findString(S, "\\0" , 0) =/=Int -1 |
296 |
| -// LineContinuation ::= \ LineTerminatorSequence |
297 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\\n" , "" )) when findString(S, "\\\n" , 0) =/=Int -1 |
298 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\\r" , "" )) when findString(S, "\\\r" , 0) =/=Int -1 andBool findString(S, "\\\r\n", 0) ==Int -1 |
299 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\\r\n" , "" )) when findString(S, "\\\r\n" , 0) =/=Int -1 |
300 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\\u2028", "" )) when findString(S, "\\\u2028", 0) =/=Int -1 |
301 |
| -rule processEscapes(S:String) => processEscapes(replaceAll(S, "\\\u2029", "" )) when findString(S, "\\\u2029", 0) =/=Int -1 |
302 |
| -// HexEscapeSequence ::= x HexDigit HexDigit |
303 |
| -// UnicodeEscapeSequence ::= u HexDigit HexDigit HexDigit HexDigit |
304 |
| -rule processEscapes(S:String) => processEscapes(processHexEscapes (S, findString(S, "\\x", 0))) when findString(S, "\\x", 0) =/=Int -1 |
305 |
| -rule processEscapes(S:String) => processEscapes(processUnicodeEscapes(S, findString(S, "\\u", 0))) when findString(S, "\\u", 0) =/=Int -1 |
306 |
| - |
307 |
| -syntax String ::= "processHexEscapes" "(" String "," Int ")" [function, notInPrograms] |
308 |
| -rule processHexEscapes (S:String, I:Int) => substrString(S, 0, I) +String chrChar(String2Base(substrString(S, I +Int 2, I +Int 2 +Int 2), 16)) +String substrString(S, I +Int 2 +Int 2, lengthString(S)) |
309 |
| - |
310 |
| -syntax String ::= "processUnicodeEscapes" "(" String "," Int ")" [function, notInPrograms] |
311 |
| -rule processUnicodeEscapes(S:String, I:Int) => substrString(S, 0, I) +String chrChar(String2Base(substrString(S, I +Int 2, I +Int 2 +Int 4), 16)) +String substrString(S, I +Int 2 +Int 4, lengthString(S)) |
312 |
| - |
313 | 223 | // Internal Semantic Methods API Call
|
314 | 224 |
|
315 | 225 | syntax CallExpression ::= APIName "(" Expressions ")"
|
316 | 226 |
|
317 | 227 | syntax APIName ::= Token{[\@][\_\$A-Za-z0-9]*} [notInRules]
|
318 | 228 |
|
319 |
| -syntax String ::= StringOfAPIName(APIName) [function, notInPrograms] |
320 |
| -rule StringOfAPIName(N:APIName) => #tokenToString(N) |
321 |
| - |
322 | 229 | endmodule
|
0 commit comments