diff --git a/lib/parser/keywords.rb b/lib/parser/keywords.rb index 1a64956..872d39a 100644 --- a/lib/parser/keywords.rb +++ b/lib/parser/keywords.rb @@ -8,7 +8,6 @@ module Parser rule(:keyword_end) { str('end').as(:end) >> space? } rule(:keyword_false) { str('false').as(:false) } rule(:keyword_field) { str('field').as(:field) >> space? } - rule(:keyword_if) { str('if').as(:if_statement) } rule(:keyword_return) { str('return').as(:return) >> space?} rule(:keyword_true) { str('true').as(:true) } rule(:keyword_nil) { str('nil').as(:nil) } @@ -16,7 +15,7 @@ module Parser # this rule is just to make sure identifiers can't be keywords. Kind of duplication here, but we need the # space in above rules, so just make sure to add any here too. - rule(:keyword){ str('if') | str('else') | str('end') | str('while') | + rule(:keyword){ str('if_') | str('else') | str('end') | str('while') | str('false') | str('true')| str('nil') | str("class") | str('return')| str('int')| str('field')} end diff --git a/lib/parser/statement.rb b/lib/parser/statement.rb index 1276c04..2851213 100644 --- a/lib/parser/statement.rb +++ b/lib/parser/statement.rb @@ -7,6 +7,9 @@ module Parser right_parenthesis >> statements_end.as(:body) end + rule( :keyword_if) do + str("if_") >> alpha.repeat.as(:condition) >> space + end rule(:if_statement) do keyword_if >> left_parenthesis >> r_value.as(:conditional) >> right_parenthesis >> diff --git a/lib/parser/transform.rb b/lib/parser/transform.rb index 3489dcf..8ba4c00 100644 --- a/lib/parser/transform.rb +++ b/lib/parser/transform.rb @@ -69,16 +69,19 @@ module Parser s(:while_statement , s(:condition , condition), s(:statements , *body)) end - rule(:if_statement => simple(:if_statement), :conditional => simple(:conditional), + rule(:condition => simple(:condition), :conditional => simple(:conditional), :true_statements => {:statements => sequence(:true_statements) , :else => simple(:else) }, :false_statements => {:statements => sequence(:false_statements) , :end => simple(:e) }) do - s(:if_statement , s(:condition, conditional), s(:true_statements, *true_statements), + s(:if_statement, condition.to_s.to_sym, + s(:condition, conditional), + s(:true_statements, *true_statements), s(:false_statements , *false_statements)) end - rule(:if_statement => simple(:if_statement), :conditional => simple(:conditional), + rule(:condition => simple(:condition), :conditional => simple(:conditional), :true_statements => {:statements => sequence(:true_statements) , :end => simple(:e) }) do - s(:if_statement , s(:condition, conditional), s(:true_statements, *true_statements), s(:false_statements , nil) ) + s(:if_statement, condition.to_s.to_sym, s(:condition, conditional), + s(:true_statements, *true_statements), s(:false_statements , nil) ) end rule(:return => simple(:return) , :return_statement => simple(:return_statement))do diff --git a/test/cases/class_definition/class_if.tst b/test/cases/class_definition/class_if.tst index 5f3c622..ef71a4c 100644 --- a/test/cases/class_definition/class_if.tst +++ b/test/cases/class_definition/class_if.tst @@ -1,6 +1,6 @@ class Ifi int ofthen(int n) - if(0) + if_zero(0) isit = 42 else maybenot = 667 diff --git a/test/cases/function_definition/function_if.tst b/test/cases/function_definition/function_if.tst index 3b37774..68027ac 100644 --- a/test/cases/function_definition/function_if.tst +++ b/test/cases/function_definition/function_if.tst @@ -1,5 +1,5 @@ int ofthen(int n) - if(0) + if_plus(0) isit = 42 else maybenot = 667 diff --git a/test/cases/function_definition/function_return_if.tst b/test/cases/function_definition/function_return_if.tst index a11a0ad..314ab7b 100644 --- a/test/cases/function_definition/function_return_if.tst +++ b/test/cases/function_definition/function_return_if.tst @@ -1,5 +1,5 @@ int retvar(int n) - if( n > 5) + if_positive( n - 5) return 10 else return 20 diff --git a/test/cases/if_statement/if_else.tst b/test/cases/if_statement/if_else.tst index aef7ded..cdf8a98 100644 --- a/test/cases/if_statement/if_else.tst +++ b/test/cases/if_statement/if_else.tst @@ -1,4 +1,4 @@ -if(0) +if_true(0) fourty = 10 else twenty = 5 diff --git a/test/cases/if_statement/if_else_expressions.tst b/test/cases/if_statement/if_else_expressions.tst index 2790ec5..a1fdb85 100644 --- a/test/cases/if_statement/if_else_expressions.tst +++ b/test/cases/if_statement/if_else_expressions.tst @@ -1,4 +1,4 @@ -if(3 > var) +if_yes(3 > var) Object.initialize(3) else var.new(33) diff --git a/test/cases/small_conditional/if_end.tst b/test/cases/small_conditional/if_end.tst index bcecc17..58ff24e 100644 --- a/test/cases/small_conditional/if_end.tst +++ b/test/cases/small_conditional/if_end.tst @@ -1,4 +1,4 @@ -if(0) +if_zero(0) four = 42 end -- -- -- diff --git a/test/cases/small_conditional/if_end_expressions.tst b/test/cases/small_conditional/if_end_expressions.tst index 3d0d001..915a0e2 100644 --- a/test/cases/small_conditional/if_end_expressions.tst +++ b/test/cases/small_conditional/if_end_expressions.tst @@ -1,4 +1,4 @@ -if(3 > var) +if_overflow(3 + 100000 ) Object.initialize(3) end -- -- --