diff --git a/lib/parser/basic.citrus b/lib/parser/basic.citrus index 65fc015..4a62ac3 100644 --- a/lib/parser/basic.citrus +++ b/lib/parser/basic.citrus @@ -45,6 +45,43 @@ grammar BasicTypes module_name_expression | string_expression end + rule keyword_begin 'begin' space* end + rule keyword_class 'class' space* end + rule keyword_def 'def' space* end + rule keyword_do 'do' space* end + rule keyword_else 'else' space* end + rule keyword_end 'end' space* end + rule keyword_if 'if' end + rule keyword_rescue 'rescue' space* end + rule keyword_return 'return' space* end + rule keyword_module 'module' space* end + rule keyword_unless 'unless' space* end + rule keyword_until 'until' space* end + rule keyword_while 'while' space* end + + rule keyword_nil + ('nil' space* ){ Ast::NilExpression.new } + end + + rule keyword_false + ('false' space*) { Ast::FalseExpression.new } + end + + rule keyword_true + ('true' space*) { Ast::TrueExpression.new } + end + + # 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 ('begin' | 'def' | 'do' | 'else' | 'end' | + 'false' | 'if' | 'rescue' | 'true' | 'nil' | + 'unless' | 'until' | 'while') space* + end + + rule keyword_expression + keyword_true | keyword_false | keyword_nil | basic_expression + end + # Tokens are single or double character combinations with "meaning" # braces, comman, point, questionmark , quotes, that kind of thing diff --git a/lib/parser/expression.citrus b/lib/parser/expression.citrus index fcec0ce..d0b1d1b 100644 --- a/lib/parser/expression.citrus +++ b/lib/parser/expression.citrus @@ -1,5 +1,5 @@ grammar Expression - include Keywords + include BasicTypes rule more_args (comma basic_expression )* { diff --git a/lib/parser/keywords.citrus b/lib/parser/keywords.citrus deleted file mode 100644 index ca3f376..0000000 --- a/lib/parser/keywords.citrus +++ /dev/null @@ -1,42 +0,0 @@ -grammar Keywords - include BasicTypes - - rule keyword_begin 'begin' space* end - rule keyword_class 'class' space* end - rule keyword_def 'def' space* end - rule keyword_do 'do' space* end - rule keyword_else 'else' space* end - rule keyword_end 'end' space* end - rule keyword_if 'if' end - rule keyword_rescue 'rescue' space* end - rule keyword_return 'return' space* end - rule keyword_module 'module' space* end - rule keyword_unless 'unless' space* end - rule keyword_until 'until' space* end - rule keyword_while 'while' space* end - - rule keyword_nil - ('nil' space* ){ Ast::NilExpression.new } - end - - rule keyword_false - ('false' space*) { Ast::FalseExpression.new } - end - - rule keyword_true - ('true' space*) { Ast::TrueExpression.new } - end - - # 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 ('begin' | 'def' | 'do' | 'else' | 'end' | - 'false' | 'if' | 'rescue' | 'true' | 'nil' | - 'unless' | 'until' | 'while') space* - end - - rule keyword_expression - keyword_true | keyword_false | keyword_nil | basic_expression - end - - root keyword_expression -end diff --git a/lib/parser/salama.rb b/lib/parser/salama.rb index 821d759..18167a0 100644 --- a/lib/parser/salama.rb +++ b/lib/parser/salama.rb @@ -6,7 +6,6 @@ module Parser # obviously a work in progress !! Citrus.require "parser/basic" - Citrus.require "parser/keywords" Citrus.require "parser/expression" Citrus.require "parser/statement" diff --git a/test/unit/test_basic.rb b/test/unit/test_basic.rb index c17160f..80712c2 100644 --- a/test/unit/test_basic.rb +++ b/test/unit/test_basic.rb @@ -3,11 +3,11 @@ require_relative "../setup" class TestBasic < MiniTest::Test #test basics and keyword expressions. Keywords includes BasicTypes def setup - @parser = Keywords + @parser = BasicTypes end - def check - parse = @parser.parse(@input) + def check rule = :root + parse = @parser.parse(@input , :root => rule) assert_equal @input , parse assert_equal @output , parse.value end @@ -15,62 +15,62 @@ class TestBasic < MiniTest::Test def test_true @input = 'true ' @output = Ast::TrueExpression.new() - check + check :keyword_true end def test_false @input = 'false ' @output = Ast::FalseExpression.new() - check + check :keyword_false end def test_nil @input = 'nil ' @output = Ast::NilExpression.new() - check + check :keyword_nil end def test_integer @input = '42 ' @output = Ast::IntegerExpression.new(42) - check + check :integer_expression end def test_name @input = 'foo ' @output = Ast::NameExpression.new('foo') - check + check :name_expression end def test_name_underscode_start @input = '_bar ' @output = Ast::NameExpression.new('_bar') - check + check :name_expression end def test_name_underscode_middle @input = 'foo_bar ' @output = Ast::NameExpression.new('foo_bar') - check + check :name_expression end def test_module_name @input = 'FooBar ' @output = Ast::ModuleName.new("FooBar") - check + check :module_name_expression end def test_string @input = '"hello"' @output = Ast::StringExpression.new('hello') - check + check :string_expression end def test_string_escapes out = 'hello \nyou' @input = '"' + out + '"' @output = Ast::StringExpression.new(out) - check + check :string_expression end end