示例#1
0
 def setup_method(self, method):
     self.parser = Parser()
     self.tok1 = self.parser.Token_n("t1", 'foo')
     self.tok2 = self.parser.Token_n("t2", 'bar')
     self.tok3 = self.parser.Token_n("t3", 'foobar')
     self.tokens = [self.tok1, self.tok2, self.tok3]
     self.parser.build_first_sets()        
示例#2
0
def build_parser(gramfile, parser=None):
    """reads a (EBNF) grammar definition and builds a parser for it"""
    if parser is None:
        parser = Parser()
    setup_tokens(parser)
    # XXX: clean up object dependencies
    from pypy.rlib.streamio import open_file_as_stream
    stream = open_file_as_stream(gramfile)
    grammardef = stream.readall()
    stream.close()
    assert isinstance(grammardef, str)
    source = GrammarSource(GRAMMAR_GRAMMAR, grammardef)
    builder = EBNFBuilder(GRAMMAR_GRAMMAR, dest_parser=parser)
    GRAMMAR_GRAMMAR.root_rules['grammar'].match(source, builder)
    builder.resolve_rules()
    parser.build_first_sets()
    parser.keywords = builder.keywords
    return parser
示例#3
0
def build_parser(gramfile, parser=None):
    """reads a (EBNF) grammar definition and builds a parser for it"""
    if parser is None:
        parser = Parser()
    setup_tokens(parser)
    # XXX: clean up object dependencies
    from pypy.rlib.streamio import open_file_as_stream
    stream = open_file_as_stream(gramfile)
    grammardef = stream.readall()
    stream.close()
    assert isinstance(grammardef, str)
    source = GrammarSource(GRAMMAR_GRAMMAR, grammardef)
    builder = EBNFBuilder(GRAMMAR_GRAMMAR, dest_parser=parser)
    GRAMMAR_GRAMMAR.root_rules['grammar'].match(source, builder)
    builder.resolve_rules()
    parser.build_first_sets()
    parser.keywords = builder.keywords
    return parser
示例#4
0
 def setup_method(self, method):
     p = self.parser = Parser()
     self.LOW = p.Token_n( 'LOW', 'low')
     self.CAP = p.Token_n( 'CAP' ,'cap')
     self.A = p.Alternative_n( 'R_A', [])
     k1 = p.KleeneStar_n( 'R_k1', 0, rule=self.LOW)
     k2 = p.KleeneStar_n( 'R_k2', 0, rule=self.CAP)
     self.B = p.Sequence_n( 'R_B', [k1, self.A])
     self.C = p.Sequence_n( 'R_C', [k2, self.A])
     self.A.args = [self.B, self.C]
     p.build_first_sets()
def test_symbols():
    p = Parser()
    x1 = p.add_symbol('sym')
    x2 = p.add_token('tok')
    x3 = p.add_anon_symbol(':sym')
    x4 = p.add_anon_symbol(':sym1')
    # test basic numbering assumption
    # symbols and tokens are attributed sequentially
    # using the same counter
    assert x2 == x1 + 1
    # anon symbols have negative value
    assert x3 != x2 + 1
    assert x4 == x3 - 1
    assert x3 < 0
    y1 = p.add_symbol('sym')
    assert y1 == x1
    y2 = p.add_token('tok')
    assert y2 == x2
    y3 = p.add_symbol(':sym')
    assert y3 == x3
    y4 = p.add_symbol(':sym1')
    assert y4 == x4
def test_load():
    d = { 5 : 'sym1',
          6 : 'sym2',
          9 : 'sym3',
          }
    p = Parser()
    p.load_symbols( d )
    v = p.add_symbol('sym4')
    # check that we avoid numbering conflicts
    assert v>9
    v = p.add_symbol( 'sym1' )
    assert v == 5
    v = p.add_symbol( 'sym2' )
    assert v == 6
    v = p.add_symbol( 'sym3' )
    assert v == 9
示例#7
0
class TestLookAheadBasics:

    def setup_method(self, method):
        self.parser = Parser()
        self.tok1 = self.parser.Token_n("t1", 'foo')
        self.tok2 = self.parser.Token_n("t2", 'bar')
        self.tok3 = self.parser.Token_n("t3", 'foobar')
        self.tokens = [self.tok1, self.tok2, self.tok3]
        self.parser.build_first_sets()        

    def test_basic_token(self):
        assert self.tok1.first_set == [self.tok1]

    def test_basic_alternative(self):
        alt = self.parser.Alternative_n("a1t", self.tokens)
        self.parser.build_first_sets()
        assert alt.first_set == self.tokens


    def test_basic_sequence(self):
        seq = self.parser.Sequence_n("seq", self.tokens)
        self.parser.build_first_sets()
        assert seq.first_set == [self.tokens[0]]

    def test_basic_kleenstar(self):
        tok1, tok2, tok3 = self.tokens
        kstar1 = self.parser.KleeneStar_n("k", 1, 3, tok1)
        kstar2 = self.parser.KleeneStar_n("k2", 0, 3, tok1)
        self.parser.build_first_sets()
        assert kstar1.first_set == [tok1]
        assert kstar2.first_set == [tok1, self.parser.EmptyToken]


    def test_maybe_empty_sequence(self):
        """S -> tok1{0,2} tok2{0,2}
         ==> S.first_set = [tok1, tok2, EmptyToken]
        """
        tok1, tok2, tok3 = self.tokens
        k1 = self.parser.KleeneStar_n( "k1", 0, 2, tok1)
        k2 = self.parser.KleeneStar_n("k2", 0, 2, tok2)
        seq = self.parser.Sequence_n( "seq", [k1, k2])
        self.parser.build_first_sets()
        assert seq.first_set == [tok1, tok2, self.parser.EmptyToken]


    def test_not_empty_sequence(self):
        """S -> tok1{0,2} tok2{1,2}
         ==> S.first_set = [tok1, tok2]
        """
        tok1, tok2, tok3 = self.tokens
        k1 = self.parser.KleeneStar_n("k1", 0, 2, tok1)
        k2 = self.parser.KleeneStar_n("k2", 1, 2, tok2)
        seq = self.parser.Sequence_n("seq", [k1, k2])
        self.parser.build_first_sets()
        assert seq.first_set == [tok1, tok2]

    def test_token_comparison(self):
        tok1  = self.parser.Token_n( "tok1", "foo" )
        tok1b = self.parser.Token_n( "tok1", "foo" )
        tok2  = self.parser.Token_n( "tok2", "foo" )
        tok3  = self.parser.Token_n( "tok2", None )
        assert tok1 == tok1b
        assert tok1 != tok2
        assert tok2 != tok3
示例#8
0
class TestLookAheadBasics:

    def setup_method(self, method):
        self.parser = Parser()
        self.tok1 = self.parser.Token_n("t1", 'foo')
        self.tok2 = self.parser.Token_n("t2", 'bar')
        self.tok3 = self.parser.Token_n("t3", 'foobar')
        self.tokens = [self.tok1, self.tok2, self.tok3]
        self.parser.build_first_sets()        

    def test_basic_token(self):
        assert self.tok1.get_first_set() == {self.tok1: None}

    def test_basic_alternative(self):
        alt = self.parser.Alternative_n("a1t", self.tokens)
        self.parser.build_first_sets()
        assert alt.get_first_set() == dict.fromkeys(self.tokens)


    def test_basic_sequence(self):
        seq = self.parser.Sequence_n("seq", self.tokens)
        self.parser.build_first_sets()
        assert seq.get_first_set() == {self.tokens[0]: None}

    def test_basic_kleenstar(self):
        tok1, tok2, tok3 = self.tokens
        kstar1 = self.parser.KleeneStar_n("k", 1, 3, tok1)
        kstar2 = self.parser.KleeneStar_n("k2", 0, 3, tok1)
        self.parser.build_first_sets()
        assert kstar1.get_first_set() == {tok1: None}
        assert kstar2.get_first_set() == {tok1: None,
                                          self.parser.EmptyToken: None}


    def test_maybe_empty_sequence(self):
        """S -> tok1{0,2} tok2{0,2}
         ==> S.first_set = {tok1, tok2, EmptyToken}
        """
        tok1, tok2, tok3 = self.tokens
        k1 = self.parser.KleeneStar_n( "k1", 0, 2, tok1)
        k2 = self.parser.KleeneStar_n("k2", 0, 2, tok2)
        seq = self.parser.Sequence_n( "seq", [k1, k2])
        self.parser.build_first_sets()
        assert seq.get_first_set() == {tok1: None,
                                       tok2: None,
                                       self.parser.EmptyToken: None}


    def test_not_empty_sequence(self):
        """S -> tok1{0,2} tok2{1,2}
         ==> S.first_set = {tok1, tok2}
        """
        tok1, tok2, tok3 = self.tokens
        k1 = self.parser.KleeneStar_n("k1", 0, 2, tok1)
        k2 = self.parser.KleeneStar_n("k2", 1, 2, tok2)
        seq = self.parser.Sequence_n("seq", [k1, k2])
        self.parser.build_first_sets()
        assert seq.get_first_set() == {tok1: None, tok2: None}

    def test_token_comparison(self):
        tok1  = self.parser.Token_n( "tok1", "foo" )
        tok1b = self.parser.Token_n( "tok1", "foo" )
        tok2  = self.parser.Token_n( "tok2", "foo" )
        tok3  = self.parser.Token_n( "tok2", None )
        assert tok1.eq(tok1b)
        assert not tok1.eq(tok2)
        assert not tok2.eq(tok3)