comparison jsparser.js @ 7:e758b89c7c92

added support for parentheses
author Atul Varma <varmaa@toolness.com>
date Sat, 30 May 2009 15:26:31 -0700
parents d62acb57d95b
children 0c62f0d3ddf7
comparison
equal deleted inserted replaced
6:d62acb57d95b 7:e758b89c7c92
139 Parsing.Parser = function Parser(tokens) { 139 Parsing.Parser = function Parser(tokens) {
140 var self = this; 140 var self = this;
141 141
142 tokens.reverse(); 142 tokens.reverse();
143 143
144 this.advance = function advance() { 144 this.advance = function advance(expectedToken) {
145 if (expectedToken && self.token.name != expectedToken)
146 throw new Error("Expected " + expectedToken + " but found " +
147 self.token.name);
145 self.token = tokens.pop(); 148 self.token = tokens.pop();
146 }; 149 };
147 150
148 this.expression = function expression(rightBindingPower) { 151 this.expression = function expression(rightBindingPower) {
149 var leftToken = self.token; 152 var leftToken = self.token;
171 174
172 new Parsing.BinaryOrUnaryOp({name: 'minus', 175 new Parsing.BinaryOrUnaryOp({name: 'minus',
173 match: '-', 176 match: '-',
174 leftBindingPower: 60}), 177 leftBindingPower: 60}),
175 178
179 new Parsing.Symbol({name: 'leftParenthesis',
180 match: '(',
181 nullDenotation: function(parser) {
182 var contents = parser.expression(0);
183 parser.advance('rightParenthesis');
184 return contents;
185 }}),
186
187 new Parsing.Symbol({name: 'rightParenthesis',
188 match: ')'}),
189
176 new Parsing.BinaryOp({name: 'multiply', 190 new Parsing.BinaryOp({name: 'multiply',
177 match: '*', 191 match: '*',
178 leftBindingPower: 70}), 192 leftBindingPower: 70}),
179 193
180 new Parsing.BinaryOp({name: 'divide', 194 new Parsing.BinaryOp({name: 'divide',
193 new Parsing.Symbol({name: 'whitespace', 207 new Parsing.Symbol({name: 'whitespace',
194 match: /^\s+/, 208 match: /^\s+/,
195 ignore: true}) 209 ignore: true})
196 ]; 210 ];
197 211
198 var code = '5+1-3 * 4+ \n -4'; 212 var code = '5+(1-3) * 4+ \n -4';
199 var tokens = Parsing.tokenize({lexicon: MyLexicon, 213 var tokens = Parsing.tokenize({lexicon: MyLexicon,
200 text: code}); 214 text: code});
201 215
202 function printTokens(tokens) { 216 function printTokens(tokens) {
203 tokens.forEach( 217 tokens.forEach(