2016-02-22 3 views
0

Учитывая правило PEG:PEG разборе матча по меньшей мере, один сохраняя порядок

rule = element1:'abc' element2:'def' element3:'ghi' ; 

Как переписать так, чтобы он соответствовал по меньшей мере, один из элементов, но, возможно, все, обеспечение их порядок?

I.e. Я хотел бы соответствовать всем из следующих строк:

abc def ghi 
abc def 
abc  ghi 
    def ghi 
abc 
    def 
     ghi 

но не пустая строка или неправильно упорядоченные выражения, например. def abc.

Конечно, с тремя элементами я мог бы изложить комбинации в отдельных правилах, но по мере увеличения количества элементов это становится склонным к ошибкам.

Есть ли способ указать это в сжатой форме?

ответ

1

Вы можете использовать ДОПОЛНИТЕЛЬНО:

rule = [element1:'abc'] [element2:'def'] [element3:'ghi'] ; 

Вы бы использовать семантическое действие для rule, чтобы проверить, что по крайней мере один маркер был подобран:

def rule(self, ast): 
    if not (ast.element1 or ast.element2 or ast.element3): 
     raise FailedSemantics('Expecting at least one token') 
    return ast 

Другой вариант заключается в использовании нескольких вариантов:

rule 
    = 
     element1:'abc' [element2:'def'] [element3:'ghi'] 
    | [element1:'abc'] element2:'def' [element3:'ghi'] 
    | [element1:'abc'] [element2:'def'] element3:'ghi' 
    ; 

Кэширование сделает более эффективным так же, как и предыдущее.

Затем, вы можете добавить вырезать элементы для дополнительных эффективности и более значимых сообщений об ошибках:

rule 
    = 
     element1:'abc' ~ [element2:'def' ~] [element3:'ghi' ~] 
    | [element1:'abc' ~] element2:'def' ~ [element3:'ghi' ~] 
    | [element1:'abc' ~] [element2:'def' ~] element3:'ghi' ~ 
    ; 

или:

rule = [element1:'abc' ~] [element2:'def' ~] [element3:'ghi' ~] ; 
+0

Спасибо за объяснение вариантов так тщательно. – ARF

1

Ответ: один Предпосылкой на разъединены, а затем последовательность опций.

rule = &(e1/e2/e3) e1? e2? e3? 

Это стандартный PEG, с & значением «должен присутствовать, но не сгорает» и? значение «необязательно». Большинство парсеров PEG имеют эти функции, если не с этими символами.

 Смежные вопросы

  • Нет связанных вопросов^_^