expr:
означает, что expr - это одна из следующих опций, которые разделены | ниже. Если его можно рассматривать как токен INTEGER
, то он берет первый. Если это может быть замечено как expr
, сопровождаемый символом *
, сопровождаемым expr
, тогда это берет второй вариант и так далее. $$
- это возвращаемое значение по умолчанию, $1
- первый токен, $2
- второй токен.
Таким образом, если бы он анализировал 5 + 6
, он видит его как expr '+' expr, поэтому он принимает 4-е определение. Он возвращает 11 как expr
, поэтому он соответствует 11 как токен INTEGER
и назначает 11 в качестве возвращаемого значения.
Если бы мы анализировали программный токен, за которым следовал 5 + 6
, он бы сделал то же самое, чтобы получить программу 11, затем взять правило expr программы и вызвать код c, который выводился бы на экран.
Слева означает, что оператор является ассоциативным слева. Как в a + b + c
= (a + b) + c
. Операторы в одной строке имеют одинаковый приоритет, а операторы под ним имеют более низкий приоритет.
По общему признанию, я некоторое время не использовал yacc, поэтому не стесняйтесь сказать мне, что я совершенно не прав.
ОБНОВЛЕНИЕ:
yacc генерирует код на c, так что вы можете поместить свой собственный код прямо в него. Таким образом, во время синтаксического анализа, если он видит «выражение программы», он может напрямую ввести код в {} в сгенерированный код.