Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Martin Traverso (mtraverso [at] acm [dot] org)

Status

As of ANTLR v3.0ea7, simple parsers can be built. I'm now working to catch up to ANTLR v3.0b3.

Once basic parser generation is working again, the plan is to add the following features:The Ruby code generation target functional as of v3.0b4. Lexer and Parser generation are supported so far. Tree Parsers are not yet supported, though.

TODO

  • Return parameters
  • Scopes
  • ASTs
  • Error recovery
  • Memoization
  • Tree grammars

Some automated tests have been ported from the Java code generation target test suite, but more tests are needed (at least one for each string template)

Sample grammar

Code Block

grammar Calculator;
options {
  language = Ruby;
}

evaluate returns [result]: r=expression { result = r };

expression returns [result]: r=mult (
    '+' r2=mult {
        r += r2
    }
  | '-' r2=mult {
        r -= r2
    }
  )* { result = r };

mult returns [result]: r=log (
    '*' r2=log {
        r *= r2
    }
  | '/' r2=log {
        r /= r2
    }
  | '%' r2=log {
        r %= r2
    }
  )* { result = r };

log returns [result]: 'ln' r=exp { result = Math::log(r) }
    | r=exp { result = r }
    ;

exp returns [result]: r=atom ('^' r2=atom { r = r ** r2 } )? { result = r }
    ;

atom returns [result]:
    n=INTEGER { result = $n.text.to_i }
  | n=DECIMAL { result = $n.text.to_f } 
  | '(' r=expression { result = r } ')'
  | 'PI' { result = Math::PI }
  | 'E' { result = Math::E }
  ;

INTEGER: DIGIT+;

DECIMAL: DIGIT+ '.' DIGIT+;

fragment
DIGIT: '0'..'9';

WS: (' ' | '\n' | '\t')+ { channel = 99 };