diff --git a/spec/crystal-dfa/nfa_spec.cr b/spec/crystal-dfa/nfa_spec.cr index 21dc54b..2e10adf 100644 --- a/spec/crystal-dfa/nfa_spec.cr +++ b/spec/crystal-dfa/nfa_spec.cr @@ -8,7 +8,7 @@ describe DFA::NFA do DFA::NFA.create_nfa(ast).should eq expected end - it "creates a state for a ConcateNode" do + context "creates a state for a ConcateNode" do it "works for the binary case" do ast = DFA::AST::ConcatNode.new [ DFA::AST::LiteralNode.new('a').as(DFA::AST::ASTNode), @@ -31,7 +31,7 @@ describe DFA::NFA do end end - it "creates a state for an AlternationNode" do + context "creates a state for an AlternationNode" do it "works for the binary case" do ast = DFA::AST::AlternationNode.new [ DFA::AST::LiteralNode.new('a').as(DFA::AST::ASTNode), @@ -99,7 +99,7 @@ describe DFA::NFA do DFA::NFA.create_nfa(ast).should eq expected end - it "creates a state for a CharacterClassNode([a-z]) One-or-More" do + context "creates a state for a CharacterClassNode([a-z]) One-or-More" do it "creates a state for the simple range case [a-z]" do ast = DFA::AST::CharacterClassNode.new(false, Array(String).new, [('a'..'z')]) expected = r_state('a', 'z') diff --git a/src/core_ext/range.cr b/src/core_ext/range.cr index 7722575..05bd183 100644 --- a/src/core_ext/range.cr +++ b/src/core_ext/range.cr @@ -47,7 +47,7 @@ module IntersectionMethods(T) end end -struct Tuple(T) +struct Tuple(*T) include IntersectionMethods(T) def -(other : self) diff --git a/src/crystal-dfa/parser.cr b/src/crystal-dfa/parser.cr index b3413e6..d85c2ed 100644 --- a/src/crystal-dfa/parser.cr +++ b/src/crystal-dfa/parser.cr @@ -143,19 +143,19 @@ module DFA end class NameParslet < PrefixParslet - def parse(parser, token) + def parse(parser, token) : AST::LiteralNode AST::LiteralNode.new(token[:value].not_nil!) end end class AnyCharacterParslet < PrefixParslet - def parse(parser, token) + def parse(parser, token) : AST::CharacterClassNode AST::CharacterClassNode.new(false, Array(String).new, ANY_CHAR_RANGES) end end class SpecialCharacterClassParslet < PrefixParslet - def parse(parser, token) + def parse(parser, token) : AST::ASTNode _next = parser.consume raise "unexpected end of input" unless _next @@ -180,7 +180,7 @@ Lexer::IDENTIFIERS.key_for(_next[:type]) end class GroupParslet < PrefixParslet - def parse(parser, token) + def parse(parser, token) : AST::GroupNode # ignore non capturing group designators if (_peek = parser.peek) && _peek[:type] == :QSTM @@ -199,7 +199,7 @@ Lexer::IDENTIFIERS.key_for(_next[:type]) end class CharacterRangeParslet < InfixParslet - def parse(parser, left, token) + def parse(parser, left, token) : AST::CharacterRangeNode parser.consume(:MINUS) right = parser.parseExpression(precedence) @@ -218,7 +218,7 @@ Lexer::IDENTIFIERS.key_for(_next[:type]) end class CharacterClassParslet < PrefixParslet - def parse(parser, token) + def parse(parser, token) : AST::CharacterClassNode | AST::AlternationNode negate = (peek = parser.peek) && (peek[:type] == :NEGATE) && parser.consume ? true : false @@ -266,7 +266,7 @@ Lexer::IDENTIFIERS.key_for(_next[:type]) end class ConcatParslet < InfixParslet - def parse(parser, left : AST::ASTNode, token) + def parse(parser, left : AST::ASTNode, token) : AST::ConcatNode exp = AST::ConcatNode.new([left.as(AST::ASTNode)]) _next = parser.parseExpression(Precedence[:LITERAL] - 1).as(AST::ASTNode?) @@ -282,7 +282,7 @@ Lexer::IDENTIFIERS.key_for(_next[:type]) end class CurlyQuantifierParslet < InfixParslet - def parse(parser, left : AST::ASTNode, token) + def parse(parser, left : AST::ASTNode, token) : AST::QuantifierNode parser.consume(:LCURLY) values = parse_quantifications( @@ -318,14 +318,14 @@ Lexer::IDENTIFIERS.key_for(_next[:type]) end class QuantifierParslet(T) < InfixParslet - def parse(parser, left : AST::ASTNode, token) + def parse(parser, left : AST::ASTNode, token) : AST::ASTNode parser.consume T.new(left) end end class AlternationParslet < InfixParslet - def parse(parser, left : AST::ASTNode, token) + def parse(parser, left : AST::ASTNode, token) : AST::AlternationNode exp = AST::AlternationNode.new([left.as(AST::ASTNode)]) while (peek = parser.peek) && (peek[:type] == :PIPE) parser.consume