грамматику, которая имеет конфликт, как следоватьРазрешающая сдвиг/свёртка в Bison
method_call: T_ID T_LPAREN method_arg_list T_RPAREN T_SEMICOLON
value: T_ID T_LSB expr T_RSB
| T_ID;
method_arg_list: /* Empty */
| method_arg method_arg_list;
method_arg: string_constant
| expr;
expr: value
| '(' expr ')';
Проблема заключается в том, что, когда он читает T_ID, он не знает, должен ли он перенести и прочитать следующее ' ('или уменьшить значение. Но разве он не должен проверять, является ли следующий токен левой скобкой?
Я совершенно новый для бизонов и парсера в целом, и мне интересно, каковы способы, которыми я могу переписать грамматики и разрешения конфликта?
Редактировать
State 60
37 method_call: T_ID . T_LPAREN method_arg_list T_RPAREN T_SEMICOLON
67 value: T_ID . T_LSB expr T_RSB
68 | T_ID .
T_LPAREN shift, and go to state 71
T_LSB shift, and go to state 72
T_LPAREN [reduce using rule 68 (value)]
$default reduce using rule 68 (value)
Для нас недостаточно информации, чтобы помочь вам. Вам необходимо создать MCVE ([MCVE]), который воспроизводит ошибку. В нем будут перечислены некоторые токены (возможно, перечисление некоторых нетерминалов в качестве токенов, хотя в вашей реальной грамматике они не являются терминалами). Вы также покажете нам отчет о сдвиге/уменьшении конфликта только для проблемного состояния в выводе 'yacc -v' (' bison -v'). Нам нужно достаточно грамматики, чтобы иметь возможность воспроизвести проблему - но не более чем достаточно, чтобы иметь возможность воспроизвести проблему. –
@JonathanLeffler ошибка исчезла после того, как я изменил несколько вещей ... Я все еще пытаюсь выяснить, что произошло. – GalaxyVintage
Я не уверен, что '' ('' должен быть 'T_LPAREN' и' ')' 'должен быть' T_RPAREN'. Как написано, с '% token T_ID T_LPAREN T_RPAREN T_SEMICOLON T_LSB T_RSB string_constant' и Bison в порядке с кодом. Надеюсь, вы ведете запись о том, что сломалось, а затем что работает. использование системы управления версиями становится очень важным. –