Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Christian Lindig <lindig@cs.uni-sb.de>
To: "Rafael 'Dido' Sevilla" <dido@imperium.ph>
Cc: Caml Mailing List <caml-list@inria.fr>
Subject: Re: [Caml-list] line number information in abstract syntax trees
Date: Wed, 17 Sep 2003 10:44:48 +0200	[thread overview]
Message-ID: <20030917084448.GD8771@st> (raw)
In-Reply-To: <20030915075339.GA20719@imperium.ph>

On Mon, Sep 15, 2003 at 03:53:39PM +0800, Rafael 'Dido' Sevilla wrote:
> and datatype =
>     Byte of int
>   | Int of int
>   | Big of int
>   | Real of int
>   | String of int
>   | Tuple of (datatype list * int)
>   | Array of (datatype * int)
>   | List of (datatype * int)
>   | Chan of (datatype * int)
> 
> This works just fine, but it just seems to me like such a grossly ugly
> hack into what is otherwise an elegant-looking data structure.  Anyone
> have style guidelines 

I like to suggest a technique (that I learned from Norman Ramsey) that
makes line numbers optional in the abstract syntax tree (AST).  The
suggested style leads to a separation of concerns.

  and expr =
        ExprAt of (expr * region)                   (* <--- *)
      | Int of (StdPrims.std_string * ty option)
      | Float of (StdPrims.std_string * ty option)
      | Char of (StdPrims.std_int * ty option)
      | Fetch of (name_or_mem)
      | BinOp of (expr * op * expr)
      | UnOp of (op * expr)
      | PrimOp of (name * actual list)

An expression is an Int or a Float or something else and by itself does
not contain a line number. But it may be wrapped in an ExprAt tag that
contains the expression and the line number (here of type region). When
you build the abstract syntax tree in a parser, you usually create
ExprAt nodes that contain the line number (but you don't have to). You
can easily implement a policy that attaches line numbers only at the
outer level on an expression, if you want to save space.  This
representation comes in handy when you create an AST not by parsing,
but directly. In this case you don't have to invent line numbers because
you simply never would generate ExprAt nodes. 

-- Christian

-- 
Christian Lindig         http://www.st.cs.uni-sb.de/~lindig/

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


  parent reply	other threads:[~2003-09-17  8:48 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-09-15  7:53 Rafael 'Dido' Sevilla
2003-09-15 11:14 ` Michal Moskal
2003-09-16 20:07 ` skaller
2003-09-17  8:44 ` Christian Lindig [this message]
2003-09-18 19:01   ` skaller
2003-09-19  6:50     ` Christian Lindig

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

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

  git send-email \
    --in-reply-to=20030917084448.GD8771@st \
    --to=lindig@cs.uni-sb.de \
    --cc=caml-list@inria.fr \
    --cc=dido@imperium.ph \
    /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