OLD | NEW |
| (Empty) |
1 part of lisp; | |
2 | |
3 /** | |
4 * LISP grammar. | |
5 */ | |
6 class LispGrammar extends GrammarParser { | |
7 LispGrammar() : super(new LispGrammarDefinition()); | |
8 } | |
9 | |
10 /** | |
11 * LISP grammar definition. | |
12 */ | |
13 class LispGrammarDefinition extends GrammarDefinition { | |
14 | |
15 start() => ref(atom).star().end(); | |
16 | |
17 atom() => ref(atom_).trim(ref(space)); | |
18 atom_() => ref(list) | |
19 | ref(number) | |
20 | ref(string) | |
21 | ref(symbol) | |
22 | ref(quote) | |
23 | ref(quasiquote) | |
24 | ref(unquote) | |
25 | ref(splice); | |
26 | |
27 list() => ref(bracket, '()', ref(cells)) | |
28 | ref(bracket, '[]', ref(cells)) | |
29 | ref(bracket, '{}', ref(cells)); | |
30 cells() => ref(cell) | |
31 | ref(empty); | |
32 cell() => ref(atom) & ref(cells); | |
33 empty() => ref(space).star(); | |
34 | |
35 number() => ref(number_).flatten(); | |
36 number_() => anyIn('-+').optional() | |
37 & char('0').or(digit().plus()) | |
38 & char('.').seq(digit().plus()).optional() | |
39 & anyIn('eE').seq(anyIn('-+').optional()).seq(digit().plus()).optional(); | |
40 | |
41 string() => ref(bracket, '""', ref(character).star()); | |
42 character() => ref(characterEscape) | ref(characterRaw); | |
43 characterEscape() => char('\\') & any(); | |
44 characterRaw() => pattern('^"'); | |
45 | |
46 symbol() => ref(symbol_).flatten(); | |
47 symbol_() => pattern('a-zA-Z!#\$%&*/:<=>?@\\^_|~+-') | |
48 & pattern('a-zA-Z0-9!#\$%&*/:<=>?@\\^_|~+-').star(); | |
49 | |
50 quote() => char('\'') & ref(list); | |
51 quasiquote() => char('`') & ref(list); | |
52 unquote() => char(',') & ref(list); | |
53 splice() => char('@') & ref(list); | |
54 | |
55 space() => whitespace() | ref(comment); | |
56 comment() => char(';') & Token.newlineParser().neg().star(); | |
57 bracket(String brackets, Parser parser) => char(brackets[0]) & parser & char(b
rackets[1]); | |
58 | |
59 } | |
OLD | NEW |