[~/src/PL/rexical/sample(master)]$ racc --help
Usage: racc [options] <input>
    -o, --output-file=PATH           output file name [<input>.tab.rb]
    -t, --debug                      Outputs debugging parser.
    -g                               Equivalent to -t (obsolete).
    -v, --verbose                    Creates <filename>.output log file.
    -O, --log-file=PATH              Log file name [<input>.output]
    -e, --executable [RUBYPATH]      Makes executable parser.
    -E, --embedded                   Embeds Racc runtime in output.
        --line-convert-all           Converts line numbers of user codes.
    -l, --no-line-convert            Never convert line numbers.
    -a, --no-omit-actions            Never omit actions.
        --superclass=CLASSNAME       Uses CLASSNAME instead of Racc::Parser.
        --runtime=FEATURE            Uses FEATURE instead of 'racc/parser'
    -C, --check-only                 Checks syntax and quit immediately.
    -S, --output-status              Outputs internal status time to time.
    -P                               Enables generator profile
    -D flags                         Flags for Racc debugging (do not use).
        --version                    Prints version and quit.
        --runtime-version            Prints runtime version and quit.
        --copyright                  Prints copyright and quit.
        --help                       Prints this message and quit.
[~/Dropbox/src/PL/rexical/sample(master)]$ cat -n Rakefile 
     1  task :default => %W{racc rex} do
     2    sh "ruby calc3.tab.rb"
     3  end
     4  
     5  task :racc do
     6    sh "racc calc3.racc"
     7  end
     8  
     9  task :rex do
    10    sh "rex calc3.rex"
    11  end
[~/Dropbox/src/PL/rexical/sample(master)]$ cat -n calc3.rex
     1  #
     2  # calc3.rex
     3  # lexical scanner definition for rex
     4  #
     5  
     6  class Calculator3
     7  macro
     8    BLANK         \s+
     9    DIGIT         \d+
    10  rule
    11    {BLANK}
    12    {DIGIT}       { [:NUMBER, text.to_i] }
    13    .|\n          { [text, text] }
    14  inner
    15  end
[~/Dropbox/src/PL/rexical/sample(master)]$ cat -n calc3.racc 
     1  #
     2  # A simple calculator, version 3.
     3  #
     4  
     5  class Calculator3
     6    prechigh
     7      nonassoc UMINUS
     8      left '*' '/'
     9      left '+' '-'
    10    preclow
    11    options no_result_var
    12  rule
    13    target  : exp
    14            | /* none */ { 0 }
    15  
    16    exp     : exp '+' exp { val[0] + val[2] }
    17            | exp '-' exp { val[0] - val[2] }
    18            | exp '*' exp { val[0] * val[2] }
    19            | exp '/' exp { val[0] / val[2] }
    20            | '(' exp ')' { val[1] }
    21            | '-' NUMBER  =UMINUS { -(val[1]) }
    22            | NUMBER
    23  end
    24  
    25  ---- header ----
    26  #
    27  # generated by racc
    28  #
    29  require 'calc3.rex'
    30  
    31  ---- inner ----
    32  
    33  ---- footer ----
    34  
    35  puts 'sample calc'
    36  puts '"q" to quit.'
    37  calc = Calculator3.new
    38  while true
    39    print '>>> '; $stdout.flush
    40    str = $stdin.gets.strip
    41    break if /q/i === str
    42    begin
    43      p calc.scan_str(str)
    44    rescue ParseError
    45      puts 'parse error'
    46    end
    47  end
right is yacc's %right, left is yacc's %left.
= SYMBOL  means yacc's %prec SYMBOL:
prechigh nonassoc '++' left '*' '/' left '+' '-' right '=' preclow
rule
  exp: exp '*' exp
     | exp '-' exp
     | '-' exp       =UMINUS   # equals to "%prec UMINUS"
         :
         :
result ($$)The value of left-hand side (lhs). A default value is
val[0].
val ($1,$2,$3...)An array of value of right-hand side (rhs).
_values (...$-2,$-1,$0)A stack of values. DO NOT MODIFY this stack unless you know what you are doing.
token NUM ID IF
You can write options for racc command in your racc file.
options OPTION OPTION ...Options are:
omit_action_callomit empty action call or not.
result_varuse/does not use local variable "result"
You can use no_ prefix to invert its meanings.
"User Code Block" is a Ruby source code which is copied to output. There are three user code block, "header" "inner" and " footer".
Format of user code is like this:
---- header
  ruby statement
  ruby statement
  ruby statement
---- inner
  ruby statement
     :
     :
If four - exist on line head, 
racc treat it as beginning of user code block. 
A name of user code must be one word.
Casiano Rodríguez León