guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

progress on my NYACC javascript example complier


From: Matt Wette
Subject: progress on my NYACC javascript example complier
Date: Fri, 2 Jun 2017 16:56:59 -0700

I started working on NYACC documentation and that got me on cleaning up the 
example (but very incomplete) javascript example.  This example uses an 
architecture where syntax trees emitted from the parser are in SXML format.  
From there I use foldts*-values (developed by Andy Wingo) to convert to Tree-IL 
and from there the Guile compiler tower takes over.  This effort is my sandbox 
for getting familiar with all tools and techniques.  I have no plan to 
implement everything.

foldts*-values allows me to trap new scope on the way down the tree: I push 
scope levels there and update the symbol table if needed.  On the way down I 
also pick off simple constructs (e.g., constants and identifiers).  Also, on 
the way down, I splice in javascript Blocks to track scope of new variables 
introduced by JavaScript variable declarations.  On the way up, the trees are 
converted to Tree-IL.

The top-level variables live in the default module scope, so I can call Guile 
procedures and Guile can make use of top-level functions defined in the 
Javascript.  The following is an example from “JavaScript, The Definitive 
Guide” in which a closure is used to provide a function that has a private var 
to generate incrementing numeric identifiers.  What you see below is
1) the javascript code
2) the output of running this in Guile
3) the SXML syntax tree emitted from the parser
4) the tree-il syntax tree emitted from the compiler

var uid = (function() { var id = 0; return function () { return id++; };})();
display(uid()); newline();
display(uid()); newline();
display(uid()); newline();
display(uid()); newline();

=> 

0
1
2
3
#<unspecified>

SXML:
(Program
  (SourceElements
    (VariableStatement
      (VariableDeclarationList
        (VariableDeclaration
          (Identifier "uid")
          (Initializer
            (CallExpression
              (FunctionExpression
                (FormalParameterList)
                (SourceElements
                  (VariableStatement
                    (VariableDeclarationList
                      (VariableDeclaration
                        (Identifier "id")
                        (Initializer
                          (PrimaryExpression (NumericLiteral "0"))))))
                  (ReturnStatement
                    (FunctionExpression
                      (FormalParameterList)
                      (SourceElements
                        (ReturnStatement
                          (post-inc
                            (PrimaryExpression (Identifier "id")))))))))
              (ArgumentList))))))
    (EmptyStatement)
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "display"))
        (ArgumentList
          (CallExpression
            (PrimaryExpression (Identifier "uid"))
            (ArgumentList)))))
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "newline"))
        (ArgumentList)))
    (EmptyStatement)
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "display"))
        (ArgumentList
          (CallExpression
            (PrimaryExpression (Identifier "uid"))
            (ArgumentList)))))
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "newline"))
        (ArgumentList)))
    (EmptyStatement)
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "display"))
        (ArgumentList
          (CallExpression
            (PrimaryExpression (Identifier "uid"))
            (ArgumentList)))))
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "newline"))
        (ArgumentList)))
    (EmptyStatement)
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "display"))
        (ArgumentList
          (CallExpression
            (PrimaryExpression (Identifier "uid"))
            (ArgumentList)))))
    (ExpressionStatement
      (CallExpression
        (PrimaryExpression (Identifier "newline"))
        (ArgumentList)))
    (EmptyStatement)))


tree-il:
  (begin
    (begin
      (define uid
        (apply (lambda ()
                 (lambda-case
                   ((() #f @args #f () (JS~6715))
                    (prompt
                      (const return)
                      (begin
                        (let (id)
                          (JS~6716)
                          ((const 0))
                          (begin
                            (lambda ()
                              (lambda-case
                                ((() #f @args #f () (JS~6718))
                                 (prompt
                                   (const return)
                                   (begin
                                     (let (~ref)
                                       (JS~6719)
                                       ((lexical id JS~6716))
                                       (begin
                                         (set! (lexical id JS~6716)
                                           (apply (@@ (nyacc lang javascript 
jslib)
                                                      js:+)
                                                  (const 1)
                                                  (lexical ~ref JS~6719)))
                                         (lexical ~ref JS~6719))))
                                   (lambda-case
                                     (((tag val) #f #f #f () (JS~6720 JS~6721))
                                      (lexical val JS~6721))))))))))
                      (lambda-case
                        (((tag val) #f #f #f () (JS~6722 JS~6723))
                         (lexical val JS~6723))))))))))
    (apply (@@ (guile-user) display)
           (apply (toplevel uid)))
    (apply (@@ (guile-user) newline))
    (apply (@@ (guile-user) display)
           (apply (toplevel uid)))
    (apply (@@ (guile-user) newline))
    (apply (@@ (guile-user) display)
           (apply (toplevel uid)))
    (apply (@@ (guile-user) newline))
    (apply (@@ (guile-user) display)
           (apply (toplevel uid)))
    (apply (@@ (guile-user) newline)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]