class Calcp prechigh nonassoc UMINUS nonassoc '@' nonassoc '!' left '^' left '*' '/' '%' left '+' '-' left '>' '<' GEQ LEQ EQL NEQL left '|' '&' right '=' preclow rule target: progn | /* none */ { result = 0 } ; # note result = val[0] by default exp: exp '+' exp { result = "+#{val[0]}#{val[2]}" } | exp '-' exp { result = "-#{val[0]}#{val[2]}" } | exp '*' exp { result = "*#{val[0]}#{val[2]}" } | exp '/' exp { result = "/#{val[0]}#{val[2]}" } | exp '%' exp { result = "%#{val[0]}#{val[2]}" } | exp '^' exp { result = "^#{val[0]}#{val[2]}" } | exp '=' exp { result = ":#{val[0]}#{val[2]}" } | exp '>' exp { result = ">#{val[0]}#{val[2]}" } | exp '<' exp { result = "<#{val[0]}#{val[2]}" } | '!' exp { result = "-1#{val[1]}" } | exp GEQ exp { result = "|>#{val[0]}#{val[2]}=#{val[0]}#{val[2]}" } | exp LEQ exp { result = "|<#{val[0]}#{val[2]}=#{val[0]}#{val[2]}" } | exp EQL exp { result = "=#{val[0]}#{val[2]}" } | exp NEQL exp { result = "-1=#{val[0]}#{val[2]}" } | exp '&' exp { result = "&#{val[0]}#{val[2]}" } | exp '|' exp { result = "|#{val[0]}#{val[2]}" } | IF exp ':' exp { result = "?#{val[1]}#{val[3]}0" } | IF exp ':' exp ELSE exp { result = "?#{val[1]}#{val[3]}#{val[5]}" } | WHILE exp ':' exp { result = "@#{val[1]}#{val[3]}" } | '(' exp ')' { result = val[1] } | '-' NUMBER = UMINUS { result = "-0#{val[1]}" } | NUMBER { result = val[0].to_SADOL } | STR { result = val[0].to_SADOL } | PRINT exp { result = "!#{val[1]}" } | INCLUDE STR { result = File.new(val[1]).readlines.to_s } | IN '(' what ')' { result = ";#{val[2]}" } | IN { result = ';3' } | CHR { result = '\'' } | FLOOR { result = '\\' } | EVAL { result = '`' } | ID '(' list ')' { result = "#{val[0]}#{val[2].to_s}"} | ID GRD '(' list ')' { result = "#{val[0]}#{val[3].length.to_SADOL}#{val[3].to_s}"} | FUN ID ':' exp ':' exp { result = "~#{val[1]}#{val[3]}#{val[5]}"} | FUN ID GRD exp { result = "~#{val[1]}-01#{val[3]}"} | '[' list ']' { result = "$#{val[1].length.to_SADOL}#{val[1].to_s}";} | '{' progn '}' { result = "(#{val[1].length.to_SADOL}#{val[1].to_s}";} | exp '[' exp ']' { result = "##{val[0]}#{val[2]}" } | '@' exp { result = "##{val[1]}-01"} | LITERAL | ID ; progn: exp ';' progn { result = [val[0],val[2]].flatten } | exp { result = [val[0]] } ; list: exp ',' list { result = [val[0],val[2]].flatten } | exp { result = [val[0]] } ; what : CH {result = "0"} | INT {result = "1"} | DBL {result = "2"} | STRI {result = "3"} ; end