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