Я пытаюсь создать синтаксический анализатор для мини-Java, где я получаю сдвиг / уменьшение конфликтов в части грамматики выражения. Я не могу разрешить этот конфликт

Это часть файла y.ouput

состояние 65

15 Выражение: Выражение. Выражение "&&"

16 | Выражение "<" Выражение

17 | Выражение "+" Выражение

18 | Выражение "-" Выражение

19 | Выражение Выражение "*"

20 | Выражение "[" Выражение "]"

21 | Выражение "" "Длина"

22 | Выражение "" Идентификатор "(" Выражение "," Выражение ")"

25 | "!" Выражение

"["  shift, and go to state 67
"<"  shift, and go to state 69
"+"  shift, and go to state 70
"-"  shift, and go to state 71
"*"  shift, and go to state 72
"."  shift, and go to state 73

"["       [reduce using rule 25 (Expression)]
"<"       [reduce using rule 25 (Expression)]
"+"       [reduce using rule 25 (Expression)]
"-"       [reduce using rule 25 (Expression)]
"*"       [reduce using rule 25 (Expression)]
"."       [reduce using rule 25 (Expression)]
$default  reduce using rule 25 (Expression)

так устанавливается приоритет операторов

%left "&&"

%left '<'

%left '-' '+' 

%left '*'

%right '!'

%left '.'

%left '(' ')'

%left '[' ']'

1 ответ

Решение

В бизоне есть разница между "x" а также 'x'; они не один и тот же знак. Итак, если вы используете bison, ваши декларации предшествования не относятся к терминалам в продуктах.

Бизон также позволяет %token определения следующей формы:

%token name quoted-string ...

Например (короткий отрывок из собственного файла грамматики бизона):

%token
  PERCENT_CODE            "%code"
  PERCENT_DEBUG           "%debug"
  PERCENT_DEFAULT_PREC    "%default-prec"
  PERCENT_DEFINE          "%define"
  PERCENT_DEFINES         "%defines"
  PERCENT_ERROR_VERBOSE   "%error-verbose"

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

"Оригинальный" yacc, по крайней мере в текущей версии "byacc", поддерживаемой Томасом Дики, допускает имена токенов как в одинарных, так и в двойных кавычках, но не различает их; и то и другое "+" а также '+' сопоставлены с токеном номер 43 ('+'). Он также не обеспечивает простой способ псевдонимов имен токенов, поэтому многосимвольные строки в двойных кавычках не особенно просты в использовании надежным способом.

Другие вопросы по тегам