Контекстная грамматика, описывающая регулярные выражения? - PullRequest
7 голосов
/ 11 июня 2009

Я пытаюсь написать движок регулярных выражений. Я хотел бы написать парсер рекурсивного спуска вручную. Как будет выглядеть не зависящая от контекста грамматика без левой рекурсии для языка регулярных выражений (а не языков, которые можно описать с помощью регулярных выражений)? Будет ли проще повторно выделить синтаксический сахар, то есть изменить a+ на aa*? Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 11 июня 2009

Левая рекурсия:

Expression = Expression '|' Sequence
           | Sequence
           ;

Sequence = Sequence Repetition
         | <empty>
         ;

Правильная рекурсия:

Expression = Sequence '|' Expression
           | Sequence
           ;

Sequence = Repetition Sequence
         | <empty>
         ;

Неоднозначная форма:

Expression = Expression '|' Expression
           | Sequence
           ;

Sequence = Sequence Sequence
         | Repetition
         | <empty>
         ;
2 голосов
/ 03 января 2011

Вы можете посмотреть исходный код для Plan 9 grep . Файл grep.y содержит грамматику yacc (LALR (1), если я правильно помню) для регулярных выражений. Вы можете начать с грамматики yacc и переписать ее для анализа рекурсивного спуска.

0 голосов
/ 11 июня 2009

Статья в Википедии о Left Recursion дает довольно хорошую информацию о том, как это осуществить.

...