start to add while loop

This commit is contained in:
Torsten Ruger
2014-05-10 19:02:51 +03:00
parent e600911fe8
commit 47f1608685
9 changed files with 89 additions and 4 deletions

View File

@ -4,7 +4,10 @@ module Ast
def initialize cond, if_true, if_false
@cond, @if_true, @if_false = cond, if_true, if_false
end
def inspect
self.class.name + ".new(" + cond.inspect + ", "+
if_true.inspect + "," + if_false.inspect + " )"
end
def attributes
[:cond, :if_true, :if_false]
end

View File

@ -37,5 +37,6 @@ end
require_relative "basic_expressions"
require_relative "conditional_expression"
require_relative "while_expression"
require_relative "function_expression"
require_relative "operator_expressions"
require_relative "operator_expressions"

View File

@ -0,0 +1,16 @@
module Ast
class WhileExpression < Expression
attr_reader :condition, :body
def initialize condition, body
@condition , @body = condition , body
end
def inspect
self.class.name + ".new(" + condition.inspect + ", " + body.inspect + " )"
end
def attributes
[:condition, :body]
end
end
end

View File

@ -6,5 +6,10 @@ module Parser
delimited_expressions(keyword_else).as(:if_true) >>
delimited_expressions(keyword_end).as(:if_false)
}
rule(:while) {
keyword_while >> expression.as(:while_cond) >> keyword_do >> newline >>
delimited_expressions(keyword_end).as(:body)
}
end
end

View File

@ -8,5 +8,8 @@ module Parser
rule(:keyword_true) { str('true').as(:true) >> space?}
rule(:keyword_false){ str('false').as(:false) >> space?}
rule(:keyword_nil) { str('null').as(:nil) >> space?}
rule(:keyword_while) { str('while').as(:while) >> space?}
rule(:keyword_do) { str('do').as(:do) >> space?}
rule(:keyword_begin) { str('begin').as(:begin) >> space?}
end
end

View File

@ -24,6 +24,11 @@ module Parser
Ast::ConditionalExpression.new(conditional, if_true, if_false)
end
rule(:while => simple(:while), :while_cond => simple(:while_cond) , :do => simple(:do),
:body => {:expressions => sequence(:body)}) do
Ast::WhileExpression.new(while_cond, body)
end
rule(:parmeter => simple(:parmeter)) { parmeter }
rule(:parmeter_list => sequence(:parmeter_list)) { parmeter_list }