Грамматика, сгенерированная BNFC, не работает на простейших примерах

Я хотел бы написать интерпретатор на haskell для простого императивного языка. Для этого я сначала написал грамматику этого языка для инструмента BNFC (http://bnfc.digitalgrammars.com/).

Часть этой грамматики посвящена арифметическим выражениям, таким как:

EAdd.     Expr ::= Expr "+" Expr ;
EMinus.   Expr ::= Expr "-" Expr ;
EMul.     Expr ::= Expr "*" Expr ;
ENum.     Expr ::= Integer ;

Имея это, я могу запустить инструмент BNFC и протестировать его с помощью предоставленного сценария. Он успешно анализирует арифметические операции.

Однако, если я добавлю еще один раздел (скажем, с типами):

Tint.    Type ::= "int" ;

А затем поместите раздел expr, арифметические операции больше не анализируются (при тестировании на 1 + 2 он говорит «Сбой синтаксического анализа ... [некоторые токены здесь] синтаксическая ошибка в строке 1 перед 1 + 2»)

Почему это происходит? Как это исправить?

Перефразируя:

Почему такая грамматика:

TInt.  Type ::=  "int" ;
EAdd.  Expr ::= Expr "+" Expr ;
ENum.  Expr ::= Integer ;

не правильно разбирает 1 + 1 с помощью bnfc?


person Mr M.    schedule 03.05.2016    source источник


Ответы (1)


При отсутствии декларации entrypoint bnfc будет использовать первая категория, определенная в грамматике как точка входа в тестовый сценарий.

т.е. если вы добавите Tint. Type ::= "int" ; в начало файла, скрипт, сгенерированный bnfc, попытается разобрать Type, а не Expr.

person Grégoire    schedule 05.06.2016