changeset 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 485783e3b54c
files jsparser.css jsparser.html parser-demo.js
diffstat 3 files changed, 50 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jsparser.css	Sat May 30 16:38:20 2009 -0700
@@ -0,0 +1,23 @@
+body {
+    font-family: helvetica, arial, sans-serif;
+    font-size: 9pt;
+}
+
+pre {
+    font-family: monaco, monospace;
+}
+
+.overlay {
+    position: absolute;
+    background: rgba(0, 0, 0, 0.5);
+    color: white;
+    padding: 0.5em;
+}
+
+.highlight {
+    background-color: yellow;
+}
+
+.tokenization {
+    cursor: pointer;
+}
--- a/jsparser.html	Sat May 30 16:08:25 2009 -0700
+++ b/jsparser.html	Sat May 30 16:38:20 2009 -0700
@@ -1,5 +1,7 @@
 <html>
 <head>
+  <link rel="stylesheet" type="text/css" media="all"
+        href="jsparser.css" />
   <title>jsparser demo</title>
 </head>
 <body>
@@ -8,8 +10,10 @@
 5+(1-3) * 4+       
      -4
 </pre>
-<p>Output</p>
-<pre class="output"></pre>
+<p>Tokenization</p>
+<pre class="tokenization"></pre>
+<p>Parse Tree</p>
+<pre class="parse-tree"></pre>
 </body>
 <script src="jquery.js"></script>
 <script src="jsparser.js"></script>
--- a/parser-demo.js	Sat May 30 16:08:25 2009 -0700
+++ b/parser-demo.js	Sat May 30 16:38:20 2009 -0700
@@ -42,27 +42,31 @@
 
 $(window).ready(
   function() {
-    function print(text) {
-      var node = document.createTextNode(text.toString() + '\n');
-      $('.output').append(node);
-    }
-
     var code = $('.input').text();
     var tokens = Parsing.tokenize({lexicon: MyLexicon,
                                    text: code});
 
-    function printTokens(tokens) {
-      tokens.forEach(
-        function(token) {
-          var repr = token.name;
-          if (token.value)
-            repr += ":" + token.value;
-          repr += " @L" + token.lineNo + ":" + token.charNo;
-          print(repr);
-        });
-    }
+    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);
+      });
 
-    printTokens(tokens);
     var parser = new Parsing.Parser(tokens);
-    print(parser.parse());
+    $('.parse-tree').text(parser.parse().toString());
   });