Я работаю над парсером и очень расстроен.В языке у нас может быть выражение вроде:
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 (эта проблема хорошо задокументирована).
Можете ли вы мне помочьвыяснить, что происходит не так?Я очень ценю вашу помощь, я действительно склоняюсь на ветряные мельницы, пытаясь выяснить проблему.