Mercurial > jsparser
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 |
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) { |
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 | 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 | |
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 | 136 return tokens; |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
137 }; |
0 | 138 |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
139 Parsing.Parser = function Parser(tokens) { |
1 | 140 var self = this; |
141 | |
142 tokens.reverse(); | |
143 | |
144 this.advance = function advance() { | |
145 self.token = tokens.pop(); | |
146 }; | |
147 | |
148 this.expression = function expression(rightBindingPower) { | |
149 var leftToken = self.token; | |
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 | 152 while (rightBindingPower < self.token.leftBindingPower) { |
153 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 leftValue = leftToken.leftDenotation(self, leftValue); |
1 | 156 } |
157 return leftValue; | |
158 }; | |
159 | |
160 this.parse = function parse() { | |
161 this.advance(); | |
162 return this.expression(0); | |
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 | 208 } |
209 | |
3
f174153281a9
massive refactoring/almost-complete rewrite.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
210 testParsing(print); |