Анализ выполняется, чтобы превратить поток токенов в структурированную, проверенную, синтаксическую информацию. Если вы хотите оценить, скажем, арифметическое выражение:
(
x
+
4
)
*
3
Вы не делаете это, сканируя токены слева направо. Вам нужно выяснить порядок операций. Вам необходимо превратить токены между ключевым словом if
и фигурными скобками {
}
в высокоуровневую структуру, описывающую оператор if, чтобы вы могли оценить ее, не манипулируя кучей токенов. И вам нужно проверить синтаксис, который по сути невозможен без правильного его синтаксического анализа; пожалуйста, прочитайте о контекстно-свободных грамматиках .
Вышеприведенное выражение станет абстрактным синтаксическим деревом , как показано ниже:
*
+ 3
x y
Оценить это довольно просто - просто обойдите дерево и посмотрите вверх x
и y
в окружающей среде.
Аналогично, с учетом ряда утверждений, подобных этому:
if
(
p
&&
q
)
{
foo
;
bar
;
}
else
{
baz
;
}
абстрактное синтаксическое дерево может иметь следующую общую структуру:
IfStatement:
Condition:
LogicalConjunction:
LeftOperand: p
RightOperand: q
TruePart:
BasicBlock:
Statement: foo
Statement: bar
FalsePart:
BasicBlock:
Statement: baz
Надеюсь, вы можете себе представить, как вы бы проходили это дерево, чтобы интерпретировать код.
Учебник по переводчикам, который я настоятельно рекомендую, - Основы языков программирования .