unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Matt Wette <matt.wette@gmail.com>
To: Guile User <guile-user@gnu.org>
Subject: progress on my NYACC javascript example complier
Date: Fri, 2 Jun 2017 16:56:59 -0700	[thread overview]
Message-ID: <4959B7EB-6E65-4431-940F-998AE6F60056@gmail.com> (raw)

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	other threads:[~2017-06-02 23:56 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-02 23:56 Matt Wette [this message]
2017-06-03  1:52 ` progress on my NYACC javascript example complier Nala Ginrut

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4959B7EB-6E65-4431-940F-998AE6F60056@gmail.com \
    --to=matt.wette@gmail.com \
    --cc=guile-user@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).