Неправильно ли использовать тип возвращаемого значения void для каждого правила в рекурсивном синтаксическом анализаторе потомков? - PullRequest
1 голос
/ 20 сентября 2011

Цитируется из вики :

void term(void) {
    factor();
    while (sym == times || sym == slash) {
        getsym();
        factor();
    }
}

void expression(void) {
    if (sym == plus || sym == minus)
        getsym();
    term();
    while (sym == plus || sym == minus) {
        getsym();
        term();
    }
}

Используется void тип возврата для каждого правила,

в таком случае, как узнать, провалена ли конкретная ветка или нет?

ИМО, каждое правило должно использовать логический тип возвращаемого значения, чтобы указывать, будет ли эта ветка неудачной или успешной.

Это правильно?

1 Ответ

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

В этом примере используется модель, в которой за сообщение об ошибках отвечает специальная подпрограмма «error», но вы, безусловно, могли бы сформулировать синтаксический анализатор как функцию, которая вернула бы «true», если входные данные представляли допустимый ввод, и «false» в противном случае. Это просто два разных стиля.

...