annotate jsparser.js @ 4:559378a3ec26

renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
author Atul Varma <varmaa@toolness.com>
date Sat, 30 May 2009 13:28:20 -0700
parents f174153281a9
children f66ec534e75a
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) {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
51 var unaryOp = this.extend(Parsing.UnaryOperator.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) {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
55 var binaryOp = this.extend(Parsing.BinaryOperator.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
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
60 Parsing.UnaryOperator = function UnaryOperator(options) {
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
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
64 Parsing.UnaryOperator.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
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
76 Parsing.BinaryOperator = function BinaryOperator(options) {
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
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
80 Parsing.BinaryOperator.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
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
133 tokens.push(new Parsing.Symbol({name: "end",
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
134 charNo: charNo,
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
135 lineNo: lineNo}));
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
136 return tokens;
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
137 };
0
94358cebb977 origination
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
138
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
139 Parsing.Parser = function Parser(tokens) {
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
140 var self = this;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
141
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
142 tokens.reverse();
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
143
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
144 this.advance = function advance() {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
145 self.token = tokens.pop();
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
146 };
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
147
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
148 this.expression = function expression(rightBindingPower) {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
149 var leftToken = self.token;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
150 self.advance();
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
151 var leftValue = leftToken.nullDenotation(self);
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
152 while (rightBindingPower < self.token.leftBindingPower) {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
153 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 leftValue = leftToken.leftDenotation(self, leftValue);
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
156 }
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
157 return leftValue;
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
158 };
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
159
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
160 this.parse = function parse() {
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
161 this.advance();
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
162 return this.expression(0);
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
163 };
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
164 };
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
165
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
166 function testParsing(print) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
167 var MyLexicon = [
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
168 new Parsing.BinaryOrUnaryOp({name: 'plus',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
169 match: '+',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
170 leftBindingPower: 60}),
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
171
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
172 new Parsing.BinaryOrUnaryOp({name: 'minus',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
173 match: '-',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
174 leftBindingPower: 60}),
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
175
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
176 new Parsing.Symbol({name: 'number',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
177 match: /^[0-9]+/,
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
178 nullDenotation: function() {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
179 return this;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
180 },
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
181 toString: function() {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
182 return this.value;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
183 }}),
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
184
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
185 new Parsing.Symbol({name: 'whitespace',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
186 match: /^\s+/,
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
187 ignore: true})
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
188 ];
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
189
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
190 var code = '5+1-3+4+ \n -4';
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
191 var tokens = Parsing.tokenize({lexicon: MyLexicon,
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
192 text: code});
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
193
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
194 function printTokens(tokens) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
195 tokens.forEach(
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
196 function(token) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
197 var repr = token.name;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
198 if (token.value)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
199 repr += ":" + token.value;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
200 repr += " @L" + token.lineNo + ":" + token.charNo;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
201 print(repr);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
202 });
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
203 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
204
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
205 printTokens(tokens);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
206 var parser = new Parsing.Parser(tokens);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
207 print(parser.parse());
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
208 }
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
209
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
210 testParsing(print);