Mercurial > repos > rhope
annotate lex.rhope @ 189:d0e3a13c1bd9 default tip
Remove old calculator example
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Oct 2011 00:24:04 -0700 |
parents | 386f4a874821 |
children |
rev | line source |
---|---|
2 | 1 |
2 Blueprint Token | |
3 { | |
4 Type | |
5 Raw Text | |
6 Text | |
7 } | |
8 | |
9 Token[type,raw,text:out] | |
10 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
11 out <- [[[Build[Token()]]Type <<[type]]Raw Text <<[raw]]Text <<[text] |
2 | 12 } |
13 | |
14 _Type Match[val, test type, type:out] | |
15 { | |
16 If[[test type]=[type]] | |
17 { | |
18 out <- Yes | |
19 }{ | |
20 out <- Val[val] | |
21 } | |
22 } | |
23 | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
24 As List[val:out] |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
25 { |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
26 [(List(),List Leaf())]Find[=[?, Blueprint Of[val]]] |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
27 { |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
28 out <- val |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
29 }{ |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
30 out <- [()]Append[val] |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
31 } |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
32 } |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
33 |
2 | 34 Type Match@Token[token,type:match,nomatch] |
35 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
36 match,nomatch <- If[Fold[_Type Match[?,?, [token]Type >>], No, As List[type]]] |
2 | 37 } |
38 | |
39 String Literal[string, raw string, escapes, text, simple tokens, token list:out] | |
40 { | |
41 first,rest <- [text]Slice[1] | |
42 If[[first] = ["\""]] | |
43 { | |
44 out <- _Lex[rest, [first]Slice[0], simple tokens, [token list]Append[Token["String Literal", raw string, string]]] | |
45 }{ | |
46 next raw <- [raw string]Append[first] | |
47 If[[first] = ["\\"]] | |
48 { | |
49 second,next text <- [rest]Slice[1] | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
50 char <- [escapes]Index[String[second]] {} |
2 | 51 { |
52 char <- Val[second] | |
53 } | |
54 next string <- [string]Append[char] | |
55 }{ | |
56 next string <- [string]Append[first] | |
57 next text <- Val[rest] | |
58 } | |
59 out <- String Literal[next string, next raw, escapes, next text, simple tokens, token list] | |
60 } | |
61 } | |
62 | |
63 Line Comment[start comment, text, simple tokens, token list:out] | |
64 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
65 comment,,next text <- [text]Partition["\n"] {} {} {} |
2 | 66 { |
67 next text <- "" | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
68 comment <- Val[text] |
2 | 69 } |
70 out <- _Lex[next text, [next text]Slice[0], simple tokens, [token list]Append[Token["Line Comment", [start comment]Append[comment], comment]]] | |
71 | |
72 } | |
73 | |
74 Block Comment[comment,raw comment, depth, text, simple tokens, token list:out] | |
75 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
76 Print[["Block Comment: Depth="]Append[String[depth]]] |
2 | 77 If[[depth] > [0]] |
78 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
79 chunk, delim, next text <- [text]Partition[("/*","*/")] {} {} {} |
2 | 80 { |
81 next text <- "" | |
82 delim <- "" | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
83 chunk <- Val[text] |
2 | 84 } |
85 If[[delim] = ["/*"]] | |
86 { | |
87 next depth <- [depth] + [1] | |
88 }{ | |
89 next depth <- [depth] - [1] | |
90 } | |
91 If[[next depth] = [0]] | |
92 { | |
93 next comment <- [comment]Append[chunk] | |
94 }{ | |
95 next comment <- [[comment]Append[chunk]]Append[delim] | |
96 } | |
97 out <- Block Comment[next comment, [[raw comment]Append[chunk]]Append[delim], next depth, next text, simple tokens, token list] | |
98 }{ | |
99 out <- _Lex[text, [raw comment]Slice[0], simple tokens, [token list]Append[Token["Block Comment", raw comment, comment]]] | |
100 } | |
101 } | |
102 | |
103 Numeric Literal[literal, text, simple tokens, token list:out] | |
104 { | |
105 first,rest <- [text]Slice[1] | |
134 | 106 If[[first] In ["01234567890.xui"]] |
2 | 107 { |
108 out <- Numeric Literal[[literal]Append[first], rest, simple tokens, token list] | |
109 }{ | |
110 out <- _Lex[text, [first]Slice[0], simple tokens, [token list]Append[Token["Numeric Literal", literal, literal]]] | |
111 } | |
112 } | |
113 | |
114 Add Token[token, text, simple tokens, token list:out] | |
115 { | |
116 out <- _Lex[text, [text]Slice[0], simple tokens, [token list]Append[token]] | |
117 } | |
118 | |
119 _Lex[text, symbol, simple tokens,token list:out] | |
120 { | |
121 If[[[text]Length] > [0]] | |
122 { | |
123 first,rest <- [text]Slice[1] | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
124 [simple tokens]Index[String[first]] |
2 | 125 { |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
126 token worker <- Val[Add Token[Token[~, first, ""], rest, ?]] |
2 | 127 }{ |
128 If[[first] = ["\""]] | |
129 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
130 escapes <- [[[Dictionary[]]Set["n","\n"]]Set["r","\r"]]Set["t","\t"] |
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
131 token worker <- Val[String Literal[[first]Slice[0], first, escapes, rest, ?]] |
2 | 132 //out <- String Literal["", first, rest, simple tokens, token list, escapes] |
133 }{ | |
134 second,second rest <- [rest]Slice[1] | |
135 If[[[first] = ["<"]] And [[second]=["-"]]] | |
136 { | |
137 [first]Append[second] | |
138 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
139 token worker <- Val[Add Token[Token["Assignment", ~, ~], second rest, ?]] |
2 | 140 } |
141 }{ | |
142 | |
143 If[[[first] = ["/"]] And [[second] = ["*"]]] | |
144 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
145 token worker <- Val[Block Comment[[first]Slice[0], [first]Append[second], 1, second rest, ?]] |
2 | 146 //out <- Block Comment[next text, simple tokens, token list, 1] |
147 }{ | |
148 If[[[first] = ["/"]] And [[second] = ["/"]]] | |
149 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
150 token worker <- Val[Line Comment[[first]Append[second], second rest, ?]] |
2 | 151 //out <- Line Comment["", [first]Append[second], next text, simple tokens, token list] |
152 }{ | |
153 If[[[first]In["0123456789"]] Or [[[first] = ["-"]] And [[second]In["0123456789"]]]] | |
154 { | |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
155 token worker <- Val[Numeric Literal[first, rest, ?]] |
2 | 156 //out <- Numeric Literal[text, simple tokens, token list] |
157 }{ | |
158 out <- _Lex[rest, [symbol]Append[first], simple tokens, token list] | |
159 } | |
160 } | |
161 } | |
162 } | |
163 | |
164 } | |
165 } | |
166 Val[token worker] | |
167 { | |
168 trimmed <- Trim[symbol, " \t\r\n"] | |
169 If[[trimmed] = [""]] | |
170 { | |
171 next list <- Val[token list] | |
172 }{ | |
132
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
173 If[[trimmed]=["?"]] |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
174 { |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
175 token type <- "Arg Placeholder" |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
176 }{ |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
177 If[[trimmed]=["~"]] |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
178 { |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
179 token type <- "Block Reference" |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
180 }{ |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
181 If[[trimmed]Ends With[">>"]] |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
182 { |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
183 next list <- [token list]Append[Token["Field Get", trimmed, Trim[[trimmed]Slice[ [[trimmed]Length]-[2] ], " \t\r\n"] ]] |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
184 }{ |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
185 If[[trimmed]Ends With["<<"]] |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
186 { |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
187 next list <- [token list]Append[Token["Field Set", trimmed, Trim[[trimmed]Slice[ [[trimmed]Length]-[2] ], " \t\r\n"] ]] |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
188 }{ |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
189 token type <- "Symbol" |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
190 } |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
191 |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
192 } |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
193 } |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
194 } |
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
195 next list <- [token list]Append[Token[token type, trimmed, trimmed]] |
2 | 196 } |
131
0a4682be2db2
Modify lexer and new parser to work in compiler
Mike Pavone <pavone@retrodev.com>
parents:
2
diff
changeset
|
197 out <- [token worker]Call[simple tokens, next list] |
2 | 198 } |
199 }{ | |
200 out <- token list | |
201 } | |
202 } | |
203 | |
204 Lex[text:out] | |
205 { | |
134 | 206 simple tokens <- [[[[[[[[[[[Dictionary[] |
2 | 207 ]Set["{", "Block Begin"] |
208 ]Set["}", "Block End"] | |
209 ]Set["(", "List Begin"] | |
210 ]Set[")", "List End"] | |
211 ]Set["[", "Args Begin"] | |
212 ]Set["]", "Args End"] | |
134 | 213 ]Set[".", "Call Separator"] |
2 | 214 ]Set[",", "List Separator"] |
215 ]Set[":", "Name Separator"] | |
216 ]Set["@", "Method Separator"] | |
217 ]Set["\n", "Newline"] | |
218 out <- _Lex[text, [text]Slice[0], simple tokens, ()] | |
219 } | |
132
1f238280047f
Some work on expression parsing in new parser
Mike Pavone <pavone@retrodev.com>
parents:
131
diff
changeset
|
220 |