annotate parser.js @ 22:40a85f135be5

Support funcall syntax inside object definition to allow import: statements
author Mike Pavone <pavone@retrodev.com>
date Mon, 26 Mar 2012 00:06:13 -0700
parents 132c7756860e
children 4d87c38404d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
33 function funcall(name, args)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
34 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
35 this.name = name;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
36 this.args = args;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
37 this.receiver = null;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
38 }
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 function object(messages)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
41 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
42 this.messages = messages;
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 lambda(args, expressions)
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.args = args;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
48 this.expressions = expressions;
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
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
51 function assignment(sym, expr)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
52 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
53 this.symbol = sym;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
54 this.expression = expr;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
55 }
1
a57a12bdae96 Added funcall syntax
Mike Pavone <pavone@retrodev.com>
parents: 0
diff changeset
56
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 var grammar =
1
a57a12bdae96 Added funcall syntax
Mike Pavone <pavone@retrodev.com>
parents: 0
diff changeset
58 'start = ws module:(object / lambda) ws { return module; };' +
4
a2c3ac7fafa2 Added support for comments
Mike Pavone <pavone@retrodev.com>
parents: 2
diff changeset
59 'ws = ([ \\t\\n\\r] / "//" [^\\n]* "\\n")*;' +
a2c3ac7fafa2 Added support for comments
Mike Pavone <pavone@retrodev.com>
parents: 2
diff changeset
60 'hws = ([ \\t] / "/*" ([^*] / "*" ! "/")* "*/" )*;' +
2
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
61 'expr = e:(funcall / methcall / opexpr) ws { return e; };' +
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
62 '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
63 '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
64 'muldiv = left:primlitsym hws opn:("*"/"/") hws right:muldiv { return new op(left, opn, right); } / primlitsym;'+
2
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
65 'primlitsym = hws val:(float / int / string / symbol / object / lambda / "(" expr:expr hws ")" { return expr; }) { return val; };' +
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
66 '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
67 '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
68 '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
69 '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
70 'object = "#{" ws messages:(assignment / funcall)* "}" { return new object(messages); };' +
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
71 'assignment = hws sym:symbol hws "<-" expr:expr ws { return new assignment(sym, expr); }' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
72 '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
73 '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
74 '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
75 '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
76 '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
77 '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
78 'methcallrest = funcall / unarymeth;' +
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
79 'unarymeth = name:symbol { return new funcall(name.name, []); };';
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 var parser = PEG.buildParser(grammar);
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82