[~/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