1 ! Copyright (C) 2007 Robbert van Dalen.
2 ! See http://factorcode.org/license.txt for BSD license.
5 USING: strings sequences kernel promises lazy-lists parser-combinators parser-combinators.simple isequences.interface isequences.base enchilada.engine ;
8 USE: parser-combinators
12 LAZY: e/- ( -- parser )
13 "-" token [ drop <.-> ] <@ ;
15 LAZY: e/# ( -- parser )
16 "#" token [ drop <.#> ] <@ ;
18 LAZY: e/^ ( -- parser )
19 "^" token [ drop <.^> ] <@ ;
21 LAZY: e/` ( -- parser )
22 "`" token [ drop <.`> ] <@ ;
24 LAZY: e/: ( -- parser )
25 ":" token [ drop <.:> ] <@ ;
27 LAZY: e/~ ( -- parser )
28 "~" token [ drop <.~> ] <@ ;
30 LAZY: e/$ ( -- parser )
31 "$" token [ drop <.$> ] <@ ;
33 LAZY: e/! ( -- parser )
34 "!" token [ drop <.!> ] <@ ;
36 LAZY: e/\ ( -- parser )
37 "\\" token [ drop <.\> ] <@ ;
39 LAZY: e/+ ( -- parser )
40 "+" token [ drop <.+> ] <@ ;
42 LAZY: e/| ( -- parser )
43 "|" token [ drop <.|> ] <@ ;
45 LAZY: e/& ( -- parser )
46 "&" token [ drop <.&> ] <@ ;
48 LAZY: e/* ( -- parser )
49 "*" token [ drop <.*> ] <@ ;
51 LAZY: e// ( -- parser )
52 "/" token [ drop <./> ] <@ ;
54 LAZY: e/< ( -- parser )
55 "<" token [ drop <.<> ] <@ ;
57 LAZY: e/> ( -- parser )
58 ">" token [ drop <.>> ] <@ ;
60 LAZY: e/@ ( -- parser )
61 "@" token [ drop <.@> ] <@ ;
63 LAZY: e/? ( -- parser )
64 "?" token [ drop <.?> ] <@ ;
66 LAZY: e/% ( -- parser )
67 "%" token [ drop <.%> ] <@ ;
69 LAZY: e-monadic ( -- parser )
70 e/- e/# <|> e/^ <|> e/` <|> e/: <|> e/~ <|> e/$ <|> e/! <|> e/\ <|> ;
72 LAZY: e-dyadic ( -- parser )
73 e/+ e/* <|> e/& <|> e/| <|> e// <|> e/< <|> e/> <|> e/@ <|> e/? <|> e/% <|> ;
75 LAZY: e-number ( -- parser )
78 LAZY: e-letter ( -- parser )
79 [ letter? ] satisfy [ 1 swap <string> ] <@ ;
81 LAZY: e-digit ( -- parser )
82 [ digit? ] satisfy [ 1 swap <string> ] <@ ;
84 LAZY: e-alphanumeric-char ( -- parser )
85 e-letter e-digit <|> ;
87 LAZY: e-alphanumeric-symbol ( -- parser )
88 e-letter e-alphanumeric-char <!*> <&> [ dup first swap second "" [ append ] reduce append ] <@ ;
90 LAZY: e-symbol ( -- parser )
91 e-alphanumeric-symbol 'string' <|> sp [ <esymbol> ] <@ ;
93 LAZY: e-symbol-list ( -- parser )
94 e-symbol <!+> [ { } [ ++ ] reduce ] <@ ;
96 LAZY: e-macro-expression ( -- parser )
97 "=" token "=" token <?> <&> sp e-expression <&> [ dup 1 tail swap first second [ t ] [ f ] if add ] <@ ;
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> ] <@ ;
103 LAZY: e-right-expression ( -- parser )
104 "=" token e-expression &> ;
106 : create-e-item ( pair -- e-item )
107 dup first swap second dup [ first ] [ drop 0 ] if <i-dual-sided> <i> ;
109 LAZY: e-item ( -- parser )
110 e-expression e-right-expression <?> <&> [ create-e-item ] <@ ;
112 LAZY: e-rest ( -- parser )
113 ";" token sp e-item &> <!*> [ { } [ ++ ] reduce ] <@ ;
115 LAZY: e-contents ( -- parser )
116 e-item e-rest <&> [ dup first swap second ++ ] <@ ;
118 LAZY: e-non-empty ( -- parser )
119 "[" token e-contents &> "]" token sp <& ;
121 LAZY: e-empty ( -- parser )
122 "[" token "]" token <&> [ drop 0 ] <@ ;
124 LAZY: e-sequence ( -- parser )
125 e-empty e-non-empty <|> e-number <|> ;
127 LAZY: e-operand ( -- parser )
128 "_" token <?> e-sequence <&> [ dup second swap first [ -- ] when <i> ] <@ ;
130 LAZY: e-operator ( -- parser )
131 e-monadic e-dyadic <|> e-macro <|> ;
133 LAZY: e-element ( -- parser )
134 e-operator e-operand <|> e-symbol <|> sp ;
136 LAZY: e-expression ( -- parser )
137 e-element <!*> [ { } [ ++ ] reduce ] <@ ;
139 : e-parse ( string -- result ) e-expression parse car parse-result-parsed ;