[#13775] Problems with racc rule definitions — Michael Neumann <neumann@...>

15 messages 2001/04/17
[#13795] Re: Problems with racc rule definitions — Minero Aoki <aamine@...> 2001/04/18

Hi,

[#13940] From Guido, with love... — Dave Thomas <Dave@...>

52 messages 2001/04/20

[#13953] regexp — James Ponder <james@...>

Hi, I'm new to ruby and am coming from a perl background - therefore I

19 messages 2001/04/21

[#14033] Distributed Ruby and heterogeneous networks — harryo@... (Harry Ohlsen)

I wrote my first small distributed application yesterday and it worked

15 messages 2001/04/22

[#14040] RCR: getClassFromString method — ptkwt@...1.aracnet.com (Phil Tomson)

It would be nice to have a function that returns a class type given a

20 messages 2001/04/22

[#14130] Re: Ruby mascot proposal — "Conrad Schneiker" <schneik@...>

Guy N. Hurst wrote:

21 messages 2001/04/24
[#14148] Re: Ruby mascot proposal — Stephen White <spwhite@...> 2001/04/24

On Tue, 24 Apr 2001, Conrad Schneiker wrote:

[#14188] Re: Ruby mascot proposal — matz@... (Yukihiro Matsumoto) 2001/04/25

Hi,

[#14193] Re: Ruby mascot proposal — "W. Kent Starr" <elderburn@...> 2001/04/25

On Tuesday 24 April 2001 23:02, Yukihiro Matsumoto wrote:

[#14138] Re: python on the smalltalk VM — Conrad Schneiker <schneik@...>

FYI: Thought this might be of interest to the JRuby and Ruby/GUI folks.

27 messages 2001/04/24
[#14153] Re: python on the smalltalk VM — Andrew Kuchling <akuchlin@...> 2001/04/24

Conrad Schneiker <schneik@austin.ibm.com> writes:

[#14154] array#flatten! question — Jim Freeze <jim@...> 2001/04/24

Hello.

[#14159] Can I insert into an array — Jim Freeze <jim@...> 2001/04/24

Ok, this may be a dumb question, but, is it possible to insert into an

[#14162] Re: Can I insert into an array — Dave Thomas <Dave@...> 2001/04/24

Jim Freeze <jim@freeze.org> writes:

[#14289] RCR: Array#insert — Shugo Maeda <shugo@...> 2001/04/27

At Wed, 25 Apr 2001 01:28:36 +0900,

[#14221] An or in an if. — Tim Pettman <tjp@...>

Hi there,

18 messages 2001/04/25

[#14267] Re: Ruby mascot proposal — "Conrad Schneiker" <schneik@...>

Danny van Bruggen,

16 messages 2001/04/26

[#14452] How to do it the Ruby-way 3 — Stefan Matthias Aust <sma@3plus4.de>

First a question: Why is

21 messages 2001/04/30

[ruby-talk:13444] Re: Using Antlr for Ruby? (was RE: Re: why won't "( a) = 1" parse?)

From: hipster <hipster@...4all.nl>
Date: 2001-04-02 13:59:51 UTC
List: ruby-talk #13444
On Mon, 02 Apr 2001  22:30:56 +0900, Robert Feldt wrote:
> Yeah, its great. Do you know if it is general (ie. you can apply operators
> (?/+/*) to sequences of symbols and nest them or if they only applies to
> individual symbols? (rockit has the latter but not the former)

The operators are generic and apply to both terminals, nonterminals
and grouped symbols (with paren's).

> > semantic_predicates
> > 	:	{ conditional_code; } => rule
> > 	|	{ conditional_code; } => rule
> > 	|	foo
> > 	;
> Ok, and you have access to parsing/lexing info when writing the
> conditional_code? What kind of info? Can you access the AST being built?

LA(1), LA(2) etc access the lookahead tokens, LT(n) accesses the
lookahead token text. You can access token values using a prefix:

	rule
		:	t:TOKEN { emit(t.getText()); }
		;

rules can have parameters

	rule [Array params]
		:	...

call with

	another_rule
	{ a = Array.new } // ;)
		:	(rule[a])*
		;

and return values

	rule returns [String foo]
		:	...

use with =

	another_rule
	{ String a; }
		:	a = rule
		;

or both

	rule [String a] returns [String b]
		:	...

To access the generated AST you can take two approaches:
- iterate over the nodes with your own code, or
- write a treeparser: this allows you to parse the AST with exactly
  the same EBNF constructs used to parse token streams -- LL(k) tree
  parsers!

[snip]
> Interesting. In rockit I've used a different but similar thing:
> 
> mult_expr:    add_expr STAR  add_expr        [Mult:  left, _, right]
>          |    add_expr SLASH add_expr        [Div:   nom, _, denom]
> add_expr:     atom PLUS  atom                [Plus:  left, _, right]
>          |    atom MINUS atom                [Minus: left, _, right]
> atom:         NUMBER                         [^]
> 
> but as you see it's not as terse even though its more flexible. Maybe
> should learn from ANTLR here...

Grammar annotation with ^'s (make a root node) and !'s (don't
auto-generate a node) is the basic stuff. You can generate custom node
using tree construction statements:

	begin!
	    :   INT PLUS i:INT
		{ #begin = #(PLUS INT i); }
	    ;

or

	stmt
		:	IF a:expr THEN b:expr ELSE c:expr
			{ #stmt = #(IF, a, b, c); }
		;

so you're free to design your AST nodes. AST's can also be
heterogeneous, so you can instantiate a different type of node class
for each grammar element (also using a simple grammar annotation).
This let's you build pretty much every kind of AST.

	Michel

In This Thread