Что происходит между {и} при написании BNF?
-
27-09-2019 - |
Вопрос
У меня проблемы с BNF. Я не могу сказать, что кажется стандартным способом делать вещи (если есть один), а есть ли типы, такие как CHAR или INT или все, что уже встроен.
Однако моя главная проблема не понимает, как работает часть BNF в фигурных брекетах.
Учитывая что-то вроде:
exp : term {$$ = $1;}
| exp '+' term {$$ = $1 + $3;}
| exp '-' term {$$ = $1 - $3;}
;
(Это было возможности украдено от где-то, и для YaCC / C)
Что на самом деле говорят вещи в фигурных брекетах? Я посмотрел на подобную вещь для счастливого генератора парсеров, и был смущен так же смущенным.
Решение
Вам нужно различать BNF в целом (и EBNF) и синтаксис YACC. Что означают брекеты в BNF варьируются с диалектом; Часто означает «выбрать одну из альтернатив», или он может быть связан с повторением или обоими. В EBNF (ISO 14977: 1996), «{...}» означает повторять ноль или более раз, а «{...} -» означает повторить одно или несколько раз (и почему это «-», а не '+' таинственный). IETF использует RFC-5234. И его диалект BNF не использует «{}» вообще.
Однако в грамматике YacC брекеты заключают действия, которые должны выполняться, когда правило совпадает (уменьшено в жаргон). Итак '{$$ = $1;}
«Действие означает« назначить значение, сопоставленное «термином» к результату снижения «exp :: = Term» (используя другой вариант BNF).
Другие советы
Вещи в фигурных скобках на самом деле представляют собой C-код, который выполняется при анализе соответствующего правила. То $
Символы - это заполнители, которые заменяются на фактические значения, проанализированные YaCC: $$
это результат, который вы хотите вычислить, в то время как $1
к $n
представляют значения символов на правой стороне правила.
Например, правило exp '+' term { $$ = $1 + $3; }
, $1
относится к exp
а также $3
это term
, так что это говорит, что когда это правило проанализировано, добавьте exp
а также term
чтобы получить результат.