2011-09-20 11 views
1

Цитируется wiki:Неправильно ли использовать тип возврата void для каждого правила в рекурсивном синтаксическом анализаторе потомков?

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 тип возвращаемого значения для каждого правила,

в этом случае, как можно знать, не может ли конкретный филиал или преуспевает?

IMO, каждое правило должно использовать логический тип возврата, чтобы указать, не удалась ли эта ветка или не удалось.

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

+0

Совет. Не говорите: «Как вы думаете?» или люди будут отмечать это как субъективное. Вместо этого скажите что-нибудь вроде «Это правильно?» – quasiverse

+0

@ quasiverse, thx для подсказки :) –

ответ

0

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

+0

И каждая запись правила должна быть закодирована '&&', скажем, 'a() && b()', а не 'a(); b();', right ? –

+0

если вы имеете в виду, как prod = prod_part1 & prod_part2 & .., то да. –

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

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