Happy / YACC сокращается, когда это должно сместиться - PullRequest
0 голосов
/ 21 февраля 2011

Я работаю над парсером и очень расстроен.В языке у нас может быть выражение вроде:

new int[3][][]

или

new int[3]

Большинство из них анализируются правильно, за исключением пустых массивов в конце.В моем парсере у меня есть:

Expression : int
             char
             null
             (...many others...)
             new NewExpression

, а затем NewExpression:

NewExpression : NonArrayType '[' Expression ']' EmptyArrays
              | NonArrayType '[' Expression ']' 

, а затем EmptyArrays представляет собой одну или несколько пустых фигурных скобок - если EmptyArrays получает пустую строку, он добавляет 20конфликты сдвига / уменьшения:

EmptyArrays : EmptyArrays EmptyArray
            | EmptyArray
EmptyArray  : '[' ']'

Однако, когда я смотрю в файле .info для парсера, я получаю это:

State 214¬
¬
▸   NewExpression -> NonArrayType lbrace Expression rbrace . EmptyArrays    (rule 80)¬
▸   NewExpression -> NonArrayType lbrace Expression rbrace .    (rule 81)¬
¬
▸   dot            reduce using rule 81¬
▸   ';'            reduce using rule 81¬
▸   ','            reduce using rule 81¬
▸   '+'            reduce using rule 81¬
▸   '-'            reduce using rule 81¬
▸   '*'            reduce using rule 81¬
▸   '/'            reduce using rule 81¬
▸   '<'            reduce using rule 81¬
▸   '>'            reduce using rule 81¬
▸   '<='           reduce using rule 81¬
▸   '>='           reduce using rule 81¬
▸   '=='           reduce using rule 81¬
▸   '!='           reduce using rule 81¬
▸   ')'            reduce using rule 81¬
▸   '['            reduce using rule 81    --I expect this should shift
▸   ']'            reduce using rule 81¬
▸   '?'            reduce using rule 81¬
▸   ':'            reduce using rule 81¬
▸   '&&'           reduce using rule 81¬
▸   '||'           reduce using rule 81

Я ожидаю, что если мыв состоянии 214 и мы видим левую фигурную скобку, мы должны переместить ее в стек и продолжить анализировать EmptyArrays.

Я не совсем уверен, что происходит, потому что, когда я удаляю все излишки избагаж (например), начиная анализ с NewExpression, дополнительные скобки анализируются правильно.Невозможно, чтобы выражение, оператор или любой нетерминал в грамматике начинался с левой фигурной скобки.Тем более, что у меня есть похожее правило для операторов if / else, которое генерирует конфликт сдвиг / уменьшение, но выбирает сдвиг, если следующий токен является else (эта проблема хорошо задокументирована).

Можете ли вы мне помочьвыяснить, что происходит не так?Я очень ценю вашу помощь, я действительно склоняюсь на ветряные мельницы, пытаясь выяснить проблему.

1 Ответ

1 голос
/ 21 февраля 2011

Возможно, у вас есть приоритет для '[' и / или ']' с чем-то вроде %left '[', который вызывает такое поведение.Удалите это объявление приоритета, и это покажет конфликт сдвига / уменьшения, который у вас здесь есть.Что касается причины конфликта сдвига / уменьшения, у вас, вероятно, также есть правило:

Expression: Expression '[' Expression ']'

для доступа к массиву.Проблема заключается в том, что, поскольку NewExpression является Expression, за ним может следовать такой индекс, а при взгляде на «[», он не может определить, является ли это началом выражения индекса илиначало EmptyArray - это потребовало бы 2-жетного просмотра.

Одна вещь, которую вы могли бы попробовать для этого конкретного случая, это сделать так, чтобы ваш лексер выполнил дополнительный поиск, необходимый здесь, и распознал [] какодиночный токен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...