Mercurial > repos > tabletprog
annotate parser.js @ 35:bf5e88f6419d
Use a function/method call strategy that actually works
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 09 Jul 2012 21:32:28 -0700 |
parents | 4d87c38404d6 |
children | e7be612fd3ae |
rev | line source |
---|---|
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
1 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
2 function op(left, op, right) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
3 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
4 this.left = left; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
5 this.op = op; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
6 this.right = right; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
7 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
8 |
19
132c7756860e
Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
9 function symbol(name, symbols) |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
10 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
11 this.name = name; |
19
132c7756860e
Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
12 this.symbols = symbols; |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
13 } |
6
554602d4cbc6
Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
14 symbol.prototype.cleanName = function() { |
554602d4cbc6
Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
15 return this.name[0] == ':' ? this.name.substr(1) : this.name; |
554602d4cbc6
Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
16 } |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
17 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
18 function intlit(val) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
19 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
20 this.val = val; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
21 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
22 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
23 function floatlit(val) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
24 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
25 this.val = val; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
26 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
27 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
28 function strlit(val) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
29 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
30 this.val = val; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
31 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
32 |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
33 function listlit(val) |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
34 { |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
35 this.val = val; |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
36 } |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
37 |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
38 function funcall(name, args) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
39 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
40 this.name = name; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
41 this.args = args; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
42 this.receiver = null; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
43 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
44 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
45 function object(messages) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
46 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
47 this.messages = messages; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
48 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
49 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
50 function lambda(args, expressions) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
51 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
52 this.args = args; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
53 this.expressions = expressions; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
54 } |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
55 |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
56 function assignment(sym, expr) |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
57 { |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
58 this.symbol = sym; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
59 this.expression = expr; |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
60 } |
1 | 61 |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
62 function isLambda(node) |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
63 { |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
64 return node instanceof lambda; |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
65 } |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
66 |
0 | 67 var grammar = |
1 | 68 'start = ws module:(object / lambda) ws { return module; };' + |
4 | 69 'ws = ([ \\t\\n\\r] / "//" [^\\n]* "\\n")*;' + |
70 'hws = ([ \\t] / "/*" ([^*] / "*" ! "/")* "*/" )*;' + | |
2
454c0346f357
Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
71 'expr = e:(funcall / methcall / opexpr) ws { return e; };' + |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
72 'opexpr = left:addsub hws opn:("<=" / ">=" / "<" / ">" / "=") hws right:opexpr { return new op(left, opn, right); } / addsub;' + |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
73 'addsub = left:muldiv hws opn:("+"/"-") hws right:addsub { return new op(left, opn, right); } / muldiv;'+ |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
74 'muldiv = left:primlitsym hws opn:("*"/"/") hws right:muldiv { return new op(left, opn, right); } / primlitsym;'+ |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
75 'primlitsym = hws val:(float / int / string / symbol / object / list / lambda / "(" expr:expr hws ")" { return expr; }) { return val; };' + |
6
554602d4cbc6
Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
76 'symbol = chars:[a-zA-Z_!?@]+ trailing:(":"? [a-zA-Z_!?@0-9])* ! ":" { for (var i in trailing) { trailing[i] = trailing[i].join(""); } return new symbol(chars.join("") + trailing.join("")); };' + |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
77 'float = digits:[0-9]+ "." decimals:[0-9]+ { return new floatlit(parseFloat(digits.join("") + "." + decimals.join(""))); };' + |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
78 'int = digits:[0-9]+ { return new intlit(parseInt(digits.join(""), 10)); };' + |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
79 'string = "\\"" text:[^\\"]* "\\"" { return new strlit(text.join("")); };' + |
22
40a85f135be5
Support funcall syntax inside object definition to allow import: statements
Mike Pavone <pavone@retrodev.com>
parents:
19
diff
changeset
|
80 'object = "#{" ws messages:(assignment / funcall)* "}" { return new object(messages); };' + |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
81 'list = "[" ws els:opexpr* "]" { return new listlit(els); };' + |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
22
diff
changeset
|
82 'assignment = ws sym:symbol hws "<-" expr:expr ws { return new assignment(sym, expr); }' + |
5
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
83 'lambda = args:((& ":") argname+ )? "{" ws exprs:(assignment / expr)* "}" { return new lambda(args[1], exprs); };' + |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
84 'argname = init:":"? chars:[a-zA-Z_!?@]+ trailing:[a-zA-Z_!?@0-9]* hws { return new symbol(init + chars.join("") + trailing.join("")); };' + |
ed5b563147ec
Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents:
4
diff
changeset
|
85 'funcall = hws parts: funcallpart+ { var fun = ""; var args = []; for (var i in parts) { fun += parts[i].name; args = args.concat(parts[i].args); } return new funcall(fun, args); };' + |
2
454c0346f357
Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
86 'funcallpart = fun:funpart args:opexpr* hws { return { name: fun, args: args}; };' + |
454c0346f357
Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
87 'funpart = chars:[a-zA-Z_!?@]+ middle:[a-zA-Z_!?@0-9]* ":" & [ \\t\\n\\r] { return chars.join("") + middle.join("") + ":"; };' + |
454c0346f357
Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
88 'methcall = receiver:opexpr hws info:methcallrest { info.receiver = receiver; return info; };' + |
454c0346f357
Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents:
1
diff
changeset
|
89 'methcallrest = funcall / unarymeth;' + |
6
554602d4cbc6
Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
90 'unarymeth = name:symbol { return new funcall(name.name, []); };'; |
0 | 91 var parser = PEG.buildParser(grammar); |
92 | |
93 |