2017-01-06 9 views
1

У меня есть следующий файл:Как совместить неупорядоченные вещи в pyPEG?

orange 
apple 
orange 
apple 
apple 
lime 
banana 

Каждый тип фруктов имеет класс, чтобы соответствовать его:

class Banana: 
    grammar = .... 

class Apple: 
    ... 

я должен соответствовать каждый фрукт неупорядоченный, я не могу сказать заранее, что будет порядок , Как настроить грамматику FruitBasket на match'em?

class FruitBasket: 
    grammar = ????? 

пс: Плоды на самом деле сложные правила, каждый тип фруктов стоит для другого блока кода, такие как функция, прототип, глобальной переменной и т.д.

ответ

1

используйте устройство list:

A list экземпляр, который не является производным от pypeg2.Concat, представляет различные варианты. Они тестируются в своей последовательности. Выбран первый вариант, который анализирует, остальные больше не тестируются. Если ни один из них не соответствует, будет поднят SyntaxError.

Например:

from pypeg2 import K, List, maybe_some, parse 

class Apple: 
    grammar = K('apple') 

class Banana: 
    grammar = K('banana') 

class Lime: 
    grammar = K('lime') 

class Orange: 
    grammar = K('orange') 

class FruitBasket(List): 
    '''An unordered collection of zero or more fruits''' 
    grammar = maybe_some([Apple, Banana, Lime, Orange]) 


if __name__ == '__main__': 

    fruit = ''' 
     orange 
     apple 
     orange 
     apple 
     apple 
     lime 
     banana 
    ''' 

    print(parse(fruit, FruitBasket)) 

Выход:

FruitBasket([<__main__.Orange object at 0x7ffa4991d8d0>, <__main__.Apple object at 0x7ffa49922c18>, <__main__.Orange object at 0x7ffa49927a58>, <__main__.Apple object at 0x7ffa499279b0>, <__main__.Apple object at 0x7ffa49927908>, <__main__.Lime object at 0x7ffa421ad828>, <__main__.Banana object at 0x7ffa421ad8d0>])