Mercurial > jsparser
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( |