Дополнительные нетерминалы в производстве - PullRequest
1 голос
/ 20 сентября 2011

Кто-нибудь знает, как обращаться со следующим случаем?

if-section:
    if-group [ elif-groups ] [ else-group ] endif-line

if-group:
    ....

elif-groups:
    elif-group
    elif-groups elif-group

elif-group:
    "#" "elif" constant-expression new-line [ group ]

else-group:
    "#" "else" new-line [ group ]

endif-line:
    "#" "endif" new-line

Все нетерминалы в секции if после группы if, начинающейся с "#". Я думаю, что в этом случае левый факторинг невозможен. Существуют ли какие-либо «решения по умолчанию», чтобы определить, нужно ли мне вызывать один из обоих (или обоих) необязательных нетерминалов?

Спасибо.

1 Ответ

0 голосов
/ 20 сентября 2011

Мне неясно, что нужно обрабатывать.Вы не можете различить [ elif-groups ] и [ else-group ], когда вы видели только #, нет.Но если вы посмотрите вперед другой токен, вы можете.Т.е. двух токенов достаточно, чтобы решить.

Это далеко не самая плохая часть грамматики C ++.

...