Mercurial > jsparser
view parser-demo.js @ 14:95b27aa47788 default tip
parse tree now displays as html.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Sun, 31 May 2009 03:57:37 -0700 |
parents | 1b7ea033b3f6 |
children |
line wrap: on
line source
var MyLexicon = [ new Parsing.BinaryOrUnaryOp({name: 'plus', match: '+', leftBindingPower: 60}), new Parsing.BinaryOrUnaryOp({name: 'minus', match: '-', leftBindingPower: 60}), new Parsing.Symbol({name: 'left parenthesis', match: '(', nullDenotation: function(parser) { var contents = parser.expression(0); parser.advance('right parenthesis'); return contents; }}), new Parsing.Symbol({name: 'right parenthesis', match: ')'}), new Parsing.BinaryOp({name: 'multiply', match: '*', leftBindingPower: 70}), new Parsing.BinaryOp({name: 'divide', match: '/', leftBindingPower: 70}), new Parsing.Symbol({name: 'number', match: /^[0-9]+/, toHtml: function() { return document.createTextNode(this.value); }, nullDenotation: function() { return this; }, toString: function() { return this.value; }}), new Parsing.Symbol({name: 'whitespace', match: /^\s+/, ignore: true}) ]; function onInputChange() { var code = $('.input').val(); $('.tokenization').empty(); $('.parse-tree').empty(); if (!code) return; try { var tokens = Parsing.tokenize({lexicon: MyLexicon, text: code}); } catch (e) { $('.tokenization').text(e.message); throw e; } jQuery.each( tokens, function() { var token = this; var node = $('<span class="token"></span>'); node.text(token.value); node.hover( function onIn() { var overlay = $('<div class="overlay"></div>'); overlay.text(token.name); overlay.css({left: $(this).position().left}); $(this).append(overlay); $(this).addClass("highlight"); }, function onOut() { $(".overlay", this).remove(); $(this).removeClass("highlight"); }); $('.tokenization').append(node); }); var parser = new Parsing.Parser(tokens); var parseTree; try { parseTree = parser.parse(); } catch (e) { $('.parse-tree').text(e.message); throw e; } $('.parse-tree').append(parseTree.toHtml()); } $(window).ready( function() { $('.input').keyup(onInputChange); onInputChange(); });