Как удалить левый рекурсив в этой грамматике ANTLR? - PullRequest
1 голос
/ 25 марта 2011

Я пытаюсь проанализировать CSP (передача последовательных процессов) Справочное руководство CSP .Я определил следующие правила грамматики.

assignment
    : IDENT '=' processExpression
    ;
processExpression
    :   ( STOP
        | SKIP
        | chaos
        | prefix
        | prefixWithValue
        | seqComposition
        | interleaving
        | externalChoice

        ....

seqComposition
    :   processExpression ';' processExpression
    ;
interleaving
    :   processExpression '|||' processExpression
    ;
externalChoice
    :   processExpression '[]' processExpression
        ;

Теперь ANTLR сообщает, что

seqComposition 
interleaving
externalChoice

являются рекурсивными.Есть ли способ удалить это, или я должен лучше использовать Bison Flex для этого типа грамматики.(Таких правил много)

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

Определить processTerm. Затем напишите правила, похожие на

assignment
    : IDENT '=' processExpression
    ;
processTerm
    :   ( STOP
        | SKIP
        | chaos
        | prefix
        ...
processExpression
    :   ( processTerm
        | processTerm ';' processExpression
        | processTerm '|||' processExpression
        | processTerm '[]' processExpression

        ....

Если вы хотите, чтобы такие вещи, как seqComposition, все еще определялись, я думаю, что это тоже будет хорошо. Но вам нужно убедиться, что при разборе processExpansion всегда будет расходоваться больше текста при выполнении ваших правил.

1 голос
/ 25 марта 2011

Прочтите руководство по удалению левой рекурсии в вики ANTLR Это мне очень помогло.

...