annotate jsparser.js @ 9:bc6f30e0f948

renamed left/right parens to be plain english and not koderSpeak
author Atul Varma <varmaa@toolness.com>
date Sat, 30 May 2009 15:38:03 -0700
parents 0c62f0d3ddf7
children 8de776b8ed31
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 };
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 function testParsing(print) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
173 var MyLexicon = [
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
174 new Parsing.BinaryOrUnaryOp({name: 'plus',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
175 match: '+',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
176 leftBindingPower: 60}),
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
177
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
178 new Parsing.BinaryOrUnaryOp({name: 'minus',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
179 match: '-',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
180 leftBindingPower: 60}),
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
181
9
bc6f30e0f948 renamed left/right parens to be plain english and not koderSpeak
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
182 new Parsing.Symbol({name: 'left parenthesis',
7
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
183 match: '(',
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
184 nullDenotation: function(parser) {
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
185 var contents = parser.expression(0);
9
bc6f30e0f948 renamed left/right parens to be plain english and not koderSpeak
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
186 parser.advance('right parenthesis');
7
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
187 return contents;
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
188 }}),
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
189
9
bc6f30e0f948 renamed left/right parens to be plain english and not koderSpeak
Atul Varma <varmaa@toolness.com>
parents: 8
diff changeset
190 new Parsing.Symbol({name: 'right parenthesis',
7
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
191 match: ')'}),
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
192
6
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
193 new Parsing.BinaryOp({name: 'multiply',
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
194 match: '*',
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
195 leftBindingPower: 70}),
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
196
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
197 new Parsing.BinaryOp({name: 'divide',
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
198 match: '/',
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
199 leftBindingPower: 70}),
d62acb57d95b added multiplication and division
Atul Varma <varmaa@toolness.com>
parents: 5
diff changeset
200
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
201 new Parsing.Symbol({name: 'number',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
202 match: /^[0-9]+/,
4
559378a3ec26 renamed computeSelf and computeLeft to nullDenotation and leftDenotation.
Atul Varma <varmaa@toolness.com>
parents: 3
diff changeset
203 nullDenotation: function() {
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
204 return this;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
205 },
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
206 toString: function() {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
207 return this.value;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
208 }}),
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
209
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
210 new Parsing.Symbol({name: 'whitespace',
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
211 match: /^\s+/,
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
212 ignore: true})
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
213 ];
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
214
7
e758b89c7c92 added support for parentheses
Atul Varma <varmaa@toolness.com>
parents: 6
diff changeset
215 var code = '5+(1-3) * 4+ \n -4';
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
216 var tokens = Parsing.tokenize({lexicon: MyLexicon,
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
217 text: code});
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
218
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
219 function printTokens(tokens) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
220 tokens.forEach(
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
221 function(token) {
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
222 var repr = token.name;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
223 if (token.value)
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
224 repr += ":" + token.value;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
225 repr += " @L" + token.lineNo + ":" + token.charNo;
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
226 print(repr);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
227 });
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
228 }
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
229
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
230 printTokens(tokens);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
231 var parser = new Parsing.Parser(tokens);
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
232 print(parser.parse());
1
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
233 }
0f1ff7d5a524 added basic parsing
Atul Varma <varmaa@toolness.com>
parents: 0
diff changeset
234
3
f174153281a9 massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents: 2
diff changeset
235 testParsing(print);