Условные операторы имеют простую рекурсивную структуру. Соответствующий синтаксический анализатор рекурсивного спуска имеет такую же простую рекурсивную структуру. Абстрактно внутренние условные операторы анализируются следующим образом:
<cond> -> if <expression> then <statement> [else <statement>]
cond :
a = parse expression
b = parse statement
if is_else(token)
then c = parse statement
return conditional(a,b,c)
else return conditional(a,b)
В вашем примере условные операторы содержат блоки условных операторов, последний из которых содержит предложение else. Предполагая, что токенизированная входная последовательность имеет такую форму и при лексическом анализе были обнаружены синтаксические ошибки, внешний условный оператор анализируется следующим образом:
<conditional> -> selection_statement: {<cond>} <cond>
conditional :
b = new block
while (iscond(next))
s = parse cond
b = insert(s,b)
return b
Конечно, реальная реализация будет значительно более детальной и утомительной. Однако предыдущее описывает в общих чертах построение дерева синтаксического анализа условного оператора, имеющего требуемую форму, из токенизированной входной последовательности.
Я только что понял, что вы говорили об оценке абстрактного синтаксического дерева. Структура функции, которая оценивает условный оператор, аналогична функции, которая анализирует условный оператор. Абстрактно,
cond(input) :
a = evaluate(if_part(input))
if is_true(a)
then evaluate(then_part(input))
else if(is_else(input))
then evaluate(else_part(input))
else return
Чтобы определить, какую часть условного выражения следует оценивать, вы должны сначала оценить часть условного выражения "if" как логическое значение. Если логическое значение равно "true", оценивается часть условного выражения "then". Если логическое значение равно false, то оценивается часть else условного выражения. Если нет «другой» части, то и оценивать нечего. Разумеется, реализация будет более детальной, чем описанная выше.
person
danportin
schedule
03.10.2011