Работая над компилятором для проекта, у меня была проблема с определенным типом продукции - PullRequest
0 голосов
/ 29 марта 2019

expr :: = let ID: TYPE [<- expr] [[, ID: TYPE [<- expr]]] ∗ в expr </p>

Я пытался реализовать это правило в Bison.

Таким образом, expr не является терминалом, в то время как [[, ID: TYPE [<- expr]]] * описывает регулярное выражение, и я подумал, что единственный способ описать это - использовать комбинацию из нескольких правил </p>

express: COMMA ID COL TYPE OSB ASSIGN expr CSB express  
    ;
expr : LET ID COL TYPE OSB ASSIGN expr CSB IN expr

где COL представляет двоеточие (:), OSB и CSB - [и] соответственно, ASSIGN - <-, TYPE - int / char. </p>

Я чувствовал, что добавление производства имеет смысл интуитивно, поскольку оно позволяет мне иметь ноль или более вхождений выражения [, ID: TYPE [<- expr]]. </strong> Я применил эту логику и к другим правилам. Тем не менее, сейчас у меня куча конфликтов, связанных с сокращением смены, и я вполне уверен, что в этом виноват. Но я не уверен, как это исправить.

Вот код, использующий Бизон и Flex . Грамматика на странице 16 из 30 .

1 Ответ

0 голосов
/ 18 июля 2019

На случай, если кто-нибудь увидит это, ссылка на репозиторий GitHub содержит правильный код. В противном случае вы можете просто выполнить поиск Compiler с помощью Cool, и вы найдете десятки других реализаций того же самого.

...