Mercurial > jsparser
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 |
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 | 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 | 95 var text = options.text; |
96 | |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
97 var tokenFound; |
0 | 98 var tokens = []; |
99 var lineNo = 0; | |
100 var charNo = 0; | |
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 | 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 | 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 | 127 } |
2 | 128 |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
129 if (!tokenFound) |
0 | 130 throw new Error("I have no idea what this is: " + text); |
131 } | |
132 | |
133 return tokens; | |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
134 }; |
0 | 135 |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
136 Parsing.Parser = function Parser(tokens) { |
1 | 137 var self = this; |
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 | 143 tokens.reverse(); |
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 | 149 self.token = tokens.pop(); |
150 }; | |
151 | |
152 this.expression = function expression(rightBindingPower) { | |
153 var leftToken = self.token; | |
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 | 156 while (rightBindingPower < self.token.leftBindingPower) { |
157 leftToken = self.token; | |
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 | 160 } |
161 return leftValue; | |
162 }; | |
163 | |
164 this.parse = function parse() { | |
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 | 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 | 233 } |
234 | |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
235 testParsing(print); |