Вопрос

У меня проблемы с 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 чтобы получить результат.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top