Сгенерированная 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" ;

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

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

Перефразировать:

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

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

неправильно разбирает 1 + 1 используя bnfc?

1 ответ

Решение

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

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

Другие вопросы по тегам