view parser-demo.js @ 11:49145e1db3e5

added an interactive tokenization display.
author Atul Varma <varmaa@toolness.com>
date Sat, 30 May 2009 16:38:20 -0700
parents 8de776b8ed31
children 1b7ea033b3f6
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]+/,
                      nullDenotation: function() {
                        return this;
                      },
                      toString: function() {
                        return this.value;
                      }}),

  new Parsing.Symbol({name: 'whitespace',
                      match: /^\s+/,
                      ignore: true})
];

$(window).ready(
  function() {
    var code = $('.input').text();
    var tokens = Parsing.tokenize({lexicon: MyLexicon,
                                   text: code});

    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);
    $('.parse-tree').text(parser.parse().toString());
  });