[#11822] RCR: Input XML support in the base Ruby — Dave Thomas <Dave@...>

15 messages 2001/03/01

[#11960] Not Ruby, for me, for the moment at least — "Michael Kreuzer" <mkreuzer@... (nospam)>

I wrote on this newsgroup last weekend about how I was considering using

11 messages 2001/03/04

[#12023] French RUG ? — "Jerome" <jeromg@...>

Hi fellow rubyers,

16 messages 2001/03/05

[#12103] disassembling and reassembling a hash — raja@... (Raja S.)

Given a hash, h1, will the following always hold?

20 messages 2001/03/06

[#12204] FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1>

Ruby is, indeed, a very well designed language.

64 messages 2001/03/07
[#12250] Re: FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1> 2001/03/07

>>>>> "GK" == GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp> writes:

[#12284] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/08

In message "[ruby-talk:12250] Re: FEATURE REQUEST: 'my' local variables"

[#12289] Re: FEATURE REQUEST: 'my' local variables — matz@... (Yukihiro Matsumoto) 2001/03/08

Hi,

[#12452] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/12

In message "[ruby-talk:12289] Re: FEATURE REQUEST: 'my' local variables"

[#12553] Re: FEATURE REQUEST: 'my' local variables — Dave Thomas <Dave@...> 2001/03/13

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#12329] Math package — Mathieu Bouchard <matju@...>

18 messages 2001/03/09

[#12330] Haskell goodies, RCR and challenge — Robert Feldt <feldt@...>

Hi,

19 messages 2001/03/09
[#12374] Re: Haskell goodies, RCR and challenge — matz@... (Yukihiro Matsumoto) 2001/03/10

Hi,

[#12349] Can Ruby-GTK display Gif Png or Jpeg files? — Phlip <phlip_cpp@...>

Ruby-san:

20 messages 2001/03/09

[#12444] class variables — Max Ischenko <max@...>

14 messages 2001/03/12

[#12606] Order, chaos, and change requests :) — Dave Thomas <Dave@...>

17 messages 2001/03/14

[#12635] email address regexp — "David Fung" <dfung@...>

i would like to locate probable email addresses in a bunch of text files,

12 messages 2001/03/14

[#12646] police warns you -- Perl is dangerous!! — Leo Razoumov <see_signature@127.0.0.1>

I just read this story on Slashdot

14 messages 2001/03/14
[#12651] Re: police warns you -- Perl is dangerous!! — pete@... (Pete Kernan) 2001/03/14

On 14 Mar 2001 11:46:35 -0800, Leo Razoumov <see_signature@127.0.0.1> wrote:

[#12691] Re: police warns you -- Perl is dangerous!! — "W. Kent Starr" <elderburn@...> 2001/03/15

On Wednesday 14 March 2001 15:40, Pete Kernan wrote:

[#12709] [OFFTOPIC] Re: police warns you -- Perl is dangerous!! — Stephen White <spwhite@...> 2001/03/16

On Fri, 16 Mar 2001, W. Kent Starr wrote:

[#12655] Re: FEATURE REQUEST: 'my' local variables — "Benjamin J. Tilly" <ben_tilly@...>

>===== Original Message From Leo Razoumov <see_signature@127.0.0.1> =====

18 messages 2001/03/14

[#12706] Library packaging — "Nathaniel Talbott" <ntalbott@...>

I have a project that I'm working on that needs to live two different lives,

30 messages 2001/03/16

[#12840] Looking for a decent compression scheme — Dave Thomas <Dave@...>

14 messages 2001/03/19

[#12895] differences between range and array — "Doug Edmunds" <dae_alt3@...>

This code comes from the online code examples for

16 messages 2001/03/20
[#12896] Re: differences between range and array — "Hee-Sob Park" <phasis@...> 2001/03/20

[#12899] Re: differences between range and array — Jim Freeze <jim@...> 2001/03/20

On Tue, 20 Mar 2001, Hee-Sob Park wrote:

[#12960] TextBox ListBox — Ron Jeffries <ronjeffries@...>

Attached is a little Spike that Chet and I are doing. It is a

13 messages 2001/03/20

[#12991] [ANN] Lapidary 0.2.0 — "Nathaniel Talbott" <ntalbott@...>

Well, here's my first major contribution to the Ruby world: Lapidary. It's a

16 messages 2001/03/20

[#13028] mkmf question — Luigi Ballabio <luigi.ballabio@...>

15 messages 2001/03/21

[#13185] Reading a file backwards — "Daniel Berger" <djberg96@...>

Hi all,

21 messages 2001/03/25
[#13197] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

> Hi Dan,

[#13203] Re: Reading a file backwards — Mathieu Bouchard <matju@...> 2001/03/25

On Sun, 25 Mar 2001, Daniel Berger wrote:

[#13210] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

"Mathieu Bouchard" <matju@sympatico.ca> wrote in message

[#13374] Passing an array to `exec'? — Lloyd Zusman <ljz@...>

I'd like to do the following:

15 messages 2001/03/31

[#13397] Multidimensional arrays and hashes? — Lloyd Zusman <ljz@...>

Is it possible in ruby to make use of constructs that correspond to

14 messages 2001/03/31

[ruby-talk:12745] Re: Parser? (a bit long)

From: Robert Feldt <feldt@...>
Date: 2001-03-16 14:07:59 UTC
List: ruby-talk #12745
On Fri, 16 Mar 2001 jjthrash@pobox.com wrote:

> If I may ask, what does your parser allow/do?
> 
Short answer: Parses Ruby code in a string to an abstract syntax tree
(AST) without you having to build the tree by hand.

Long answer:
The Ruby parser is one example in rockit (Ruby Object-oriented Compiler
construction toolKIT), a lib of compilation-related classes I started
develop as a part of RubyVM (see previous posts on this). Rockit will take
a textual description of your grammar and give you back a parser (or the
Ruby code for a parser). This is much like yacc, bison etc. but you don't
need to write action code; the parser will give you back an abstract
syntax tree (using a special way to specify the AST in the grammar). This
is good when compiling since you will want to make multiple passes over
some tree structure; the parser can as well build it for you as you having
to do it by hand. It's flexible even if it will not be the fastest
approach if you have a specific "translation" goal in mind.

Current status is that the parser generator in rockit bootstraps itself
and works correctly with some small grammars (couple of calculators and a
minibasic interpreter). It doesn't work correctly with the Ruby
grammar since I haven't implemented any conflict resolution
(precendence and associativity for operators most notably). So this is
still vaporware ;-), with some decision to be taken and some code to be
written. So I won't make it more vaporish by telling you whats planned
after that... :-)

Below you'll find an example of a grammar and interpreter for minibasic
(well it can handle Bignum's so just a tad more powerful than traditional
Basic... :-)) together with example basic code. Sorry for the long lines
wreaking up to formatting.

Regards,

Robert

----------------------------------
Rockit grammar for minibasic:
----------------------------------
Tokens
  blank      = /(( )|(\t)|(\v))+/                     [:IGNORE]
  identifier = /[A-Z]([A-Z]|\d)*/
  number     = /\d+/
  string     = /"[^\r\n]*"/
  new_line   = /(\r\n)|(\r)|(\n)/

Productions
  statements -> statement+         [Statements: statements]
  statement  -> 'IF' condition 'THEN' new_line
                  statements
                  optional_else?
                'ENDIF' new_line

[If: _,condition,_,_,statements,optelse,_,_]
             |  'FOR' identifier ':=' expression 'TO' expression new_line
                  statements
                'NEXT' new_line 

[For: _,ident,_,from,_,to,_,statements,_,_]
             |  'READ' identifier new_line
                                   [Read: _,ident,_]
             |  'PRINT' expression new_line
                                   [PrintExp: _,expression,_]
             |  'PRINT' string new_line
                                   [PrintString: _,string,_]
             |  'PRINTLN' new_line [PrintLn]
             |  identifier ':=' expression new_line
                                   [Assignment: ident,_,expression,_]
  optional_else -> 'ELSE' new_line statements
                                   [Else: _,_,statements]
  condition -> expression '<' expression
				   [LessThan: left,_,right]
            |  expression '>' expression
				   [GreaterThan: left,_,right]
            |  expression '=' expression
				   [Equal: left,_,right]
  expression -> value              [Value: val]
             |  value '+' value    [Plus: left,_,right]
             |  value '-' value    [Minus: left,_,right]
             |  value '*' value    [Mul: left,_,right]
             |  value '/' value    [Div: left,_,right]
             |  value 'MOD' value  [Mod: left,_,right]
  value -> number                  [Constant: num]
        |  identifier              [Identifier: ident]
        |  '(' expression ')'      [Paran: _,expr,_]

----------------------------------
Minbasic interpreter in Ruby:
----------------------------------
require 'minibasic_parser'
parser = MiniBasic.parser
$vars = Hash.new(0)  # For variables and their values. Default value is 0.

def mb_eval(ast)
  case ast.node_name
  when "Statements"
    ast.statements.each {|statement| mb_eval(statement)}
  when "If"
    if mb_eval(ast.condition) # What is true and false in basic?
      mb_eval(ast.statements)
    elsif ast.optelse
      mb_eval(ast.optelse)
    end
  when "For"
    from, to = mb_eval(ast.from), mb_eval(ast.to)
    (from..to).each do |i|
      $vars[ast.ident.lexeme] = i
      mb_eval(ast.statements)
    end
  when "Read"
    print "? "; STDOUT.flush
    $vars[ast.ident.lexeme] = STDIN.gets.to_i   # Error catching?!
  when "PrintExp"
    print mb_eval(ast.expression).inspect; STDOUT.flush
  when "PrintString"
    print ast.string.lexeme[1..-2]; STDOUT.flush
  when "PrintLn"
    print "\n"; STDOUT.flush
  when "Assignment"
    $vars[ast.ident.lexeme] = mb_eval(ast.expression)
  when "Else"
    mb_eval(ast.statements)
  when "LessThan"
    mb_eval(ast.left) < mb_eval(ast.right)
  when "GreaterThan"
    mb_eval(ast.left) > mb_eval(ast.right)
  when "Equal"
    mb_eval(ast.left) == mb_eval(ast.right)
  when "Value"
    mb_eval(ast.val)
  when "Plus"
    mb_eval(ast.left) + mb_eval(ast.right)
  when "Minus"
    mb_eval(ast.left) - mb_eval(ast.right)
  when "Mul"
    mb_eval(ast.left) * mb_eval(ast.right)
  when "Div"
    mb_eval(ast.left) / mb_eval(ast.right) # Catch div by 0?
  when "Mod"
    mb_eval(ast.left) % mb_eval(ast.right) # Catch mod by 0?
  when "Constant"
    ast.num.lexeme.to_i
  when "Identifier"
    $vars[ast.ident.lexeme]
  when "Paran"
    mb_eval(ast.expr)
  end
end

File.open(ARGV[0], "r") do |bf|
  ast = delete_unnamed_nodes(parser.parse(bf.read))
  mb_eval(ast)
end

------------------------
Minibasic example:
------------------------
PRINT "I can sum even numbers."
PRINTLN
PRINT "At what number should I start summing"
READ START
PRINT "At what number should I stop"
READ STOP
SUM := 0
FOR I := START TO STOP
  IF (I MOD 2) = 0 THEN
    SUM := (SUM + I)
  ENDIF
NEXT
PRINT "The sum of all even numbers between "
PRINT START
PRINT " and "
PRINT STOP
PRINT " is = "
PRINT SUM



In This Thread