Я хотел бы написать интерпретатор на 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?