annotate jsparser.js @ 10:8de776b8ed31

made the demo work on the web instead of the command line.
author Atul Varma <varmaa@toolness.com>
date Sat, 30 May 2009 16:08:25 -0700
parents bc6f30e0f948
children 95b27aa47788
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
1 var Parsing = {};
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
2
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
3 Parsing.Symbol = function Symbol(options) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
4 if (options)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
5 for (name in options)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
6 if (options.hasOwnProperty(name))
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
7 this[name] = options[name];
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
8 };
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
9
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
10 Parsing.Symbol.prototype = {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
11 leftBindingPower: 0,
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
12 nullDenotation: function() {
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
13 throw new Error("No nullDenotation for " + this.name);
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
14 },
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
15 leftDenotation: function() {
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
16 throw new Error("No leftDenotation for " + this.name);
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
17 },
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
18 extend: function(contents) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
19 function Subclass() {}
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
20 Subclass.prototype = this;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
21 var instance = new Subclass();
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
22 if (contents)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
23 for (name in contents)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
24 if (contents.hasOwnProperty(name))
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
25 instance[name] = contents[name];
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
26 return instance;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
27 },
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
28 makeTokenAt: function(text) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
29 var matchValue = null;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
30 if (typeof(this.match) == 'string') {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
31 if (text.indexOf(this.match) == 0)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
32 matchValue = this.match;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
33 } else {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
34 // It's a Regular Expression.
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
35 var match = text.match(this.match);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
36 if (match)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
37 matchValue = match[0];
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
38 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
39 if (matchValue)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
40 return this.extend({value: matchValue});
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
41 return null;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
42 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
43 };
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
44
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
45 Parsing.BinaryOrUnaryOp = function BinaryOrUnaryOp(options) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
46 Parsing.Symbol.call(this, options);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
47 };
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
48
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
49 Parsing.BinaryOrUnaryOp.prototype = new Parsing.Symbol(
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
50 {nullDenotation: function(parser) {
5
f66ec534e75a renamed BinaryOperator to BinaryOp, UnaryOperator to UnaryOp.
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
51 var unaryOp = this.extend(Parsing.UnaryOp.prototype);
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
52 return unaryOp.nullDenotation(parser);
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
53 },
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
54 leftDenotation: function(parser, left) {
5
f66ec534e75a renamed BinaryOperator to BinaryOp, UnaryOperator to UnaryOp.
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
55 var binaryOp = this.extend(Parsing.BinaryOp.prototype);
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
56 return binaryOp.leftDenotation(parser, left);
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
57 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
58 });
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
59
5
f66ec534e75a renamed BinaryOperator to BinaryOp, UnaryOperator to UnaryOp.
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
60 Parsing.UnaryOp = function UnaryOp(options) {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
61 Parsing.Symbol.call(this, options);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
62 };
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
63
5
f66ec534e75a renamed BinaryOperator to BinaryOp, UnaryOperator to UnaryOp.
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
64 Parsing.UnaryOp.prototype = new Parsing.Symbol(
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
65 {nullDenotation: function(parser) {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
66 this.arity = "unary";
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
67 this.operand = parser.token;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
68 parser.advance();
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
69 return this;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
70 },
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
71 toString: function() {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
72 return "(" + this.match + this.operand + ")";
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
73 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
74 });
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
75
5
f66ec534e75a renamed BinaryOperator to BinaryOp, UnaryOperator to UnaryOp.
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
76 Parsing.BinaryOp = function BinaryOp(options) {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
77 Parsing.Symbol.call(this, options);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
78 };
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
79
5
f66ec534e75a renamed BinaryOperator to BinaryOp, UnaryOperator to UnaryOp.
Atul Varma <varmaa@toolness.com>
parents: 4
diff changeset
80 Parsing.BinaryOp.prototype = new Parsing.Symbol(
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
81 {leftDenotation: function(parser, left) {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
82 this.arity = "binary";
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
83 this.leftOperand = left;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
84 this.rightOperand = parser.expression(this.leftBindingPower);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
85 return this;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
86 },
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
87 toString: function() {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
88 return ("(" + this.leftOperand + " " + this.match + " " +
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
89 this.rightOperand + ")");
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
90 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
91 });
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
92
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
93 Parsing.tokenize = function tokenize(options) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
94 var lexicon = options.lexicon;
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
95 var text = options.text;
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
96
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
97 var tokenFound;
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
98 var tokens = [];
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
99 var lineNo = 0;
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
100 var charNo = 0;
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
101
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
102 while (text) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
103 tokenFound = false;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
104 for (var i = 0; i < lexicon.length && !tokenFound; i++) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
105 var symbol = lexicon[i];
2
032f64260794 refactored tokenizer
Atul Varma <varmaa@toolness.com>
parents: 1
diff changeset
106
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
107 var matchedToken = symbol.makeTokenAt(text);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
108 if (matchedToken) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
109 tokenFound = true;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
110 if (!matchedToken.ignore) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
111 matchedToken.lineNo = lineNo;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
112 matchedToken.charNo = charNo;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
113 tokens.push(matchedToken);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
114 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
115 var matchedValue = matchedToken.value;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
116 text = text.slice(matchedValue.length);
2
032f64260794 refactored tokenizer
Atul Varma <varmaa@toolness.com>
parents: 1
diff changeset
117
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
118 // Increment the current line and character number.
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
119 var nextNewline;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
120 while ((nextNewline = matchedValue.indexOf('\n')) != -1) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
121 lineNo += 1;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
122 charNo = 0;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
123 matchedValue = matchedValue.slice(nextNewline + 1);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
124 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
125 charNo += matchedValue.length;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
126 }
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
127 }
2
032f64260794 refactored tokenizer
Atul Varma <varmaa@toolness.com>
parents: 1
diff changeset
128
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
129 if (!tokenFound)
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
130 throw new Error("I have no idea what this is: " + text);
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
131 }
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
132
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
133 return tokens;
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
134 };
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
135
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
136 Parsing.Parser = function Parser(tokens) {
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
137 var self = this;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
138
8
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
139 tokens = tokens.slice();
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
140
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
141 tokens.push(new Parsing.Symbol({name: "end of input"}));
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
142
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
143 tokens.reverse();
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
144
7
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
145 this.advance = function advance(expectedToken) {
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
146 if (expectedToken && self.token.name != expectedToken)
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
147 throw new Error("Expected " + expectedToken + " but found " +
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
148 self.token.name);
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
149 self.token = tokens.pop();
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
150 };
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
151
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
152 this.expression = function expression(rightBindingPower) {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
153 var leftToken = self.token;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
154 self.advance();
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
155 var leftValue = leftToken.nullDenotation(self);
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
156 while (rightBindingPower < self.token.leftBindingPower) {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
157 leftToken = self.token;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
158 self.advance();
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
159 leftValue = leftToken.leftDenotation(self, leftValue);
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
160 }
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
161 return leftValue;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
162 };
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
163
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
164 this.parse = function parse() {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
165 this.advance();
8
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
166 var value = this.expression(0);
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
167 this.advance("end of input");
0c62f0d3ddf7 parser now ensures that it's done when it thinks it is
Atul Varma <varmaa@toolness.com>
parents: 7
diff changeset
168 return value;
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
169 };
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
170 };