2016-05-03 7 views
0

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

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

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

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

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

Tint. Type ::= "int" ; 

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

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

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

Почему такой gramar:

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

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

ответ

0

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

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