Что происходит между {и} при написании BNF? - PullRequest
3 голосов
/ 28 октября 2010

У меня проблемы с БНФ. Я не могу сказать, что кажется стандартным способом выполнения действий (если он есть), и есть ли такие типы, как char или int или что-то уже встроенное.

Однако моя главная проблема - не понять, как работает часть БНФ в фигурных скобках.
Учитывая что-то вроде:

exp    : term                           {$$ = $1;}  
| exp '+' term                   {$$ = $1 + $3;}  
| exp '-' term                   {$$ = $1 - $3;}  
;  

(Это было украдено откуда-то и предназначено для yacc / C)

Что на самом деле говорится в фигурных скобках? Я смотрел на аналогичную вещь и для генератора счастливых парсеров, и был так же смущен.

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Необходимо различать BNF в целом (и EBNF) и синтаксис Yacc.Что означают фигурные скобки в BNF, зависит от диалекта;это часто означает «выбрать одну из альтернатив», или оно может быть связано с повторением или и тем, и другим.В EBNF (ISO 14977: 1996) «{...}» означает повторение ноль или более раз, а «{...} -» означает повторение один или несколько раз (и почему это «-», а не ««+» таинственный).IETF использует RFC-5234 , а его диалект BNF вообще не использует '{}'.

В грамматике Yacc скобки заключают в себе действия, которые должны выполняться, когдаправило соответствует (сокращено на жаргоне).Таким образом, действие «{$$ = $1;}» означает «присваивать значение, совпадающее с« term », результату сокращения« exp :: = term »(с использованием другого варианта BNF).

2 голосов
/ 28 октября 2010

Материал в фигурных скобках на самом деле является кодом C, который выполняется при разборе соответствующего правила. Символы $ являются заполнителями, которые заменяются фактическими значениями, проанализированными yacc: $$ - это результат, который вы хотите вычислить, в то время как $1 до $n представляют значения символов в правой части правило.

Например, правило exp '+' term { $$ = $1 + $3; }, $1 относится к exp, а $3 - это term, поэтому это говорит о том, что когда это правило анализируется, добавьте exp и term в получить результат.

...