1. 1 51 2. parser.y 3. node.rb 4. CD-ROM
1 10 2 i 0 i 10 " i i+1 3 for(i = 0; i <= 10; i++) printf(" \n"); i = 0; while(i <= 10) printf(" \n"); i++; 4 when /\A==/ @q.push [ :EQ, [lineno, == ] ] expr EQ expr ==, [val[0], val[2]] ) 5 when /\A==/, /\A[><]=?/ @q.push [ :COMPAIR, [lineno, $&.intern] ] 6 expr COMPAIR expr val[1][1], [val[0], val[2]] ) 7 prechigh nonassoc UMINUS left * / - 1 -
left + - nonassoc EQ preclow 8 prechigh nonassoc UMINUS left * / left + - nonassoc COMPAIR preclow 9 if_stmt : IF stmt THEN EOL stmt_list elsif_stmt else_stmt END result = IfNode.new( @fname, val[0][0], val[1], val[4], val[5], val[6] ) 10 elsif_stmt : ELSIF stmt THEN EOL stmt_list 11 elsif_stmt : elsif_stmt ELSIF stmt THEN EOL stmt_list result.push [val[2], val[5]] ELSIF stmt THEN EOL stmt_list result = [[val[1], val[4]]] 12 class IfNode < Node def initialize( fname, lineno, cond, tstmt, elsif_stmt, fstmt ) super fname, lineno @condition = cond @tstmt = tstmt @elsif_stmt = elsif_stmt @fstmt = fstmt def evaluate( intp ) if @condition.evaluate(intp) then exec_list intp, @tstmt else @@else_flug = true - 2 -
if @elsif_stmt then @elsif_stmt.each do @@each_elsif #p @@each_elsif if @@each_elsif[0].evaluate(intp) then exec_list intp, @@each_elsif[1] @@else_flug = false break if @@else_flug then exec_list intp, @fstmt if @fstmt 13 14 @@else_flug = true if @elsif_stmt then @elsif_stmt.each do @@each_elsif #p @@each_elsif if @@each_elsif[0].evaluate(intp) then exec_list intp, @@each_elsif[1] @@else_flug = false break if @@else_flug then => :IF => :IF 15 IDENT = expr 16 IDENT expr 17 @q.push [, [lineno, $&.intern] ] @q.push [, [lineno, $&.intern] ] when /\A / - 3 -
@q.push [, [lineno, $&.intern] ] IDENT expr 18 @q.push [ :WO, [lineno, $&.intern] ] @q.push [ :NI, [lineno, $&.intern] ] @q.push [ :DAINYU, [lineno, $&.intern] ] IDENT NI expr WO DAINYU 19 puts hello 20 a = hello 21 a hello a hello hello a hello a 22 a hello a hello 23 a hello hello a 24 @q.push [ :DAINYU, [lineno, $&.intern] ] @q.push [ :WO, [lineno, $&.intern] ] @q.push [ :NI, [lineno, $&.intern] ] assign : IDENT = expr - 4 -
IDENT NI expr WO DAINYU expr WO IDENT NI DAINYU 25 a = 1 26 a 1 a 1 1 a 1 a 27 when /\A ( )?/ @q.push [ :DAINYU, [lineno, $&.intern] ] @q.push [ :WO, [lineno, $&.intern] ] @q.push [ :NI, [lineno, $&.intern] ] assign : IDENT = expr IDENT NI expr WO DAINYU expr WO IDENT NI DAINYU 28 a b a b a b a b a b a b a b 29 when /\A / @q.push [ :HITOSII, [lineno, $&.intern] ] @q.push [ :IZYOU, [lineno, $&.intern] ] @q.push [ :IKA, [lineno, $&.intern] ] when /\A / @q.push [ :YORIOOKII, [lineno, $&.intern] ] when /\A /, /\A / @q.push [ :YORITIISAI, [lineno, $&.intern] ] - 5 -
expr : # expr TO expr GA HITOSII ==, [val[0], val[2]] ) expr GA expr TO HITOSII ==, [val[0], val[2]] ) expr GA expr IZYOU >=, [val[0], val[2]] ) expr GA expr IKA <=, [val[0], val[2]] ) expr GA expr YORIOOKII >, [val[0], val[2]] ) expr GA expr YORITIISAI <, [val[0], val[2]] ) 30 if a = 1 then puts a = 1 elsif a = 2 puts a = 2 else puts else 31 a 1 a = 1 a 2 a = 2 else - 6 -
32 @q.push [ :IF, [lineno, $&.intern] ] when /\A / @q.push [ :THEN, [lineno, $&.intern] ] when /\A ( )?/ @q.push [ :ELSIF, [lineno, $&.intern] ] when /\A ( )?/ @q.push [ :ELSE, [lineno, $&.intern] ], /\A /, /\A /, /\A / @q.push [ :END, [lineno, $&.intern] ] if_stmt : IF stmt THEN EOL stmt_list elsif_stmt else_stmt END else_stmt : ELSE EOL stmt_list elsif_stmt : elsif_stmt ELSIF stmt THEN EOL stmt_list ELSIF stmt THEN EOL stmt_list 33 i = 0 while i <= 10 puts i i += 1 34 i 0 i 10 i i i+1 35 when /\A / @q.push [ :KURIKAESU, [lineno, $&.intern] ] when /\A( )? / @q.push [ :AIDA, [lineno, $&.intern] ] while_stmt: WHILE stmt DO EOL stmt_list END stmt AIDA KURIKAESU EOL stmt_list END 36 puts( hello ) puts hello puts() - 7 -
puts 37 hello 38 when /\A ( ( )?)?/ word = puts @q.push [ :FUNCTION, [lineno, word.intern ] ] stmt : # stmt FUNCTION 39 40 when /\A ( ( )?)?/ word = puts @q.push [ :FUNCTION, [lineno, word.intern ] ] 41 when /\A ( )?/ word = print @q.push [ :FUNCTION, [lineno, word.intern ] ] 42 43 when /\A ( )?/ word = puts @q.push [ :KAIGYO, [lineno, word.intern ] ] KAIGYO result = FuncallNode.new( @fname, val[0][0], val[0][1], [] ) - 8 -
44 ruby jpprog src.txt data.txt 45 1 46 when /\A ( 1 )? ( )([a-za-z][a-za-z0-9_]*) ( )/ word = gets line_var = $3 @q.push [ :GETS, [lineno, line_var.intern ] ] funcall : # GETS tmp = FuncallNode.new( @fname, val[0][0], gets.intern, [] ) result = AssignNode.new( @fname, val[0][0], val[0][1], tmp ) 47 ARGV.shift 48 #@fname:#line: syntax error on #v.inspect 49 \n\n #@fname #line #v.inspect \n\n 50 51 @q.push [ :IF, [lineno, $&.intern] ] ruby jpprog src.txt - 9 -