]> gitweb.factorcode.org Git - factor.git/blob - unmaintained/enchilada/parser/parser.factor
400165526121e1a998fa3243d4292ef235ed3555
[factor.git] / unmaintained / enchilada / parser / parser.factor
1 ! Copyright (C) 2007 Robbert van Dalen.
2 ! See http://factorcode.org/license.txt for BSD license.
3
4 IN: enchilada.parser
5 USING: strings sequences kernel promises lazy-lists parser-combinators parser-combinators.simple isequences.interface isequences.base enchilada.engine ;
6
7 USE: lazy-lists
8 USE: parser-combinators
9
10 DEFER: e-expression
11
12 LAZY: e/- ( -- parser )
13     "-" token [ drop <.-> ] <@ ;
14
15 LAZY: e/# ( -- parser )
16     "#" token [ drop <.#> ] <@ ;
17
18 LAZY: e/^ ( -- parser )
19     "^" token [ drop <.^> ] <@ ;
20
21 LAZY: e/` ( -- parser )
22     "`" token [ drop <.`> ] <@ ;
23
24 LAZY: e/: ( -- parser )
25     ":" token [ drop <.:> ] <@ ;
26
27 LAZY: e/~ ( -- parser )
28     "~" token [ drop <.~> ] <@ ;
29
30 LAZY: e/$ ( -- parser )
31     "$" token [ drop <.$> ] <@ ;
32
33 LAZY: e/! ( -- parser )
34     "!" token [ drop <.!> ] <@ ;
35
36 LAZY: e/\ ( -- parser )
37     "\\" token [ drop <.\> ] <@ ;
38
39 LAZY: e/+ ( -- parser )
40     "+" token [ drop <.+> ] <@ ;
41
42 LAZY: e/| ( -- parser )
43     "|" token [ drop <.|> ] <@ ;
44
45 LAZY: e/& ( -- parser )
46     "&" token [ drop <.&> ] <@ ;
47
48 LAZY: e/* ( -- parser )
49     "*" token [ drop <.*> ] <@ ;
50
51 LAZY: e// ( -- parser )
52     "/" token [ drop <./> ] <@ ;
53
54 LAZY: e/< ( -- parser )
55     "<" token [ drop <.<> ] <@ ;
56
57 LAZY: e/> ( -- parser )
58     ">" token [ drop <.>> ] <@ ;
59
60 LAZY: e/@ ( -- parser )
61     "@" token [ drop <.@> ] <@ ;
62
63 LAZY: e/? ( -- parser )
64     "?" token [ drop <.?> ] <@ ;
65
66 LAZY: e/% ( -- parser )
67     "%" token [ drop <.%> ] <@ ;
68
69 LAZY: e-monadic ( -- parser )
70     e/- e/# <|> e/^ <|> e/` <|> e/: <|> e/~ <|> e/$ <|> e/! <|> e/\ <|> ;
71
72 LAZY: e-dyadic ( -- parser )
73     e/+ e/* <|> e/& <|> e/| <|> e// <|> e/< <|> e/> <|> e/@ <|> e/? <|> e/% <|> ;
74
75 LAZY: e-number ( -- parser )
76     'integer' ;
77
78 LAZY: e-letter ( -- parser )
79     [ letter? ] satisfy [ 1 swap <string> ] <@ ;
80
81 LAZY: e-digit ( -- parser )
82     [ digit? ] satisfy [ 1 swap <string> ] <@ ;
83
84 LAZY: e-alphanumeric-char ( -- parser )
85     e-letter e-digit <|> ;
86
87 LAZY: e-alphanumeric-symbol ( -- parser )
88     e-letter e-alphanumeric-char <!*> <&> [ dup first swap second "" [ append ] reduce append ] <@ ;
89
90 LAZY: e-symbol ( -- parser )
91     e-alphanumeric-symbol 'string' <|> sp [ <esymbol> ] <@ ;
92
93 LAZY: e-symbol-list ( -- parser )
94     e-symbol <!+> [ { } [ ++ ] reduce ] <@ ;
95
96 LAZY: e-macro-expression ( -- parser )
97     "=" token "=" token <?> <&> sp e-expression <&> [ dup 1 tail swap first second [ t ] [ f ] if add ] <@ ;
98
99 LAZY: e-macro ( -- parser )
100     "{" token sp e-symbol-list &> e-macro-expression <?> <&> "}" token sp <& 
101     [ dup first swap second dup [ first ] [ drop { 0 f } ] if dup first swap second <e-macro> ] <@ ;
102
103 LAZY: e-right-expression ( -- parser )
104     "=" token e-expression &> ;
105
106 : create-e-item ( pair -- e-item )
107     dup first swap second dup [ first ] [ drop 0 ] if <i-dual-sided> <i> ;
108  
109 LAZY: e-item ( -- parser )
110 e-expression e-right-expression <?> <&> [ create-e-item ] <@ ;
111
112 LAZY: e-rest ( -- parser )
113 ";" token sp e-item &> <!*> [ { } [ ++ ] reduce ] <@ ;
114
115 LAZY: e-contents ( -- parser )
116 e-item e-rest <&> [ dup first swap second ++ ] <@ ;
117
118 LAZY: e-non-empty ( -- parser )
119 "[" token e-contents &> "]" token sp <& ;
120
121 LAZY: e-empty ( -- parser )
122     "[" token "]" token <&> [ drop 0 ] <@ ;
123
124 LAZY: e-sequence ( -- parser )
125     e-empty e-non-empty <|> e-number <|> ;
126
127 LAZY: e-operand ( -- parser )
128     "_" token <?> e-sequence <&> [ dup second swap first [ -- ] when <i> ] <@ ;
129
130 LAZY: e-operator ( -- parser )
131     e-monadic e-dyadic <|> e-macro <|>  ;
132
133 LAZY: e-element ( -- parser )
134     e-operator e-operand <|> e-symbol <|> sp ;
135
136 LAZY: e-expression ( -- parser )
137     e-element <!*> [ { } [ ++ ] reduce ] <@ ;
138
139 : e-parse  ( string -- result ) e-expression parse car parse-result-parsed ;