diff --git a/lib/prattle/ast/number.rb b/lib/prattle/ast/number.rb new file mode 100644 index 0000000..2e423cf --- /dev/null +++ b/lib/prattle/ast/number.rb @@ -0,0 +1,23 @@ +module Prattle + module AST + class Number < AST::Node + Prattle::Parser.register self + + def self.rule_name + "number" + end + + def initialize(value) + @value = value + end + + attr_reader :value + + def self.grammar(g) + g.number = g.reg(/0|([1-9][0-9]*)/) do |i| + Number.new(i.to_i) + end + end + end + end +end diff --git a/test/ast/test_number.rb b/test/ast/test_number.rb new file mode 100644 index 0000000..1d8c843 --- /dev/null +++ b/test/ast/test_number.rb @@ -0,0 +1,20 @@ +require 'test/unit' +require 'prattle/parser' + +class TestNumber < Test::Unit::TestCase + def test_parse + parser = Prattle::Parser.new("1") + node = parser.parse :number + + assert_kind_of Prattle::AST::Number, node + assert_equal 1, node.value + end + + def test_zero + parser = Prattle::Parser.new("0") + node = parser.parse :number + + assert_kind_of Prattle::AST::Number, node + assert_equal 0, node.value + end +end