Я пытаюсь создать синтаксический анализатор для мини-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 ('+'). Он также не обеспечивает простой способ псевдонимов имен токенов, поэтому многосимвольные строки в двойных кавычках не особенно просты в использовании надежным способом.