2016-06-18 5 views
0

грамматику, которая имеет конфликт, как следоватьРазрешающая сдвиг/свёртка в 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) 
+0

Для нас недостаточно информации, чтобы помочь вам. Вам необходимо создать MCVE ([MCVE]), который воспроизводит ошибку. В нем будут перечислены некоторые токены (возможно, перечисление некоторых нетерминалов в качестве токенов, хотя в вашей реальной грамматике они не являются терминалами). Вы также покажете нам отчет о сдвиге/уменьшении конфликта только для проблемного состояния в выводе 'yacc -v' (' bison -v'). Нам нужно достаточно грамматики, чтобы иметь возможность воспроизвести проблему - но не более чем достаточно, чтобы иметь возможность воспроизвести проблему. –

+0

@JonathanLeffler ошибка исчезла после того, как я изменил несколько вещей ... Я все еще пытаюсь выяснить, что произошло. – GalaxyVintage

+0

Я не уверен, что '' ('' должен быть 'T_LPAREN' и' ')' 'должен быть' T_RPAREN'. Как написано, с '% token T_ID T_LPAREN T_RPAREN T_SEMICOLON T_LSB T_RSB string_constant' и Bison в порядке с кодом. Надеюсь, вы ведете запись о том, что сломалось, а затем что работает. использование системы управления версиями становится очень важным. –

ответ

0

Леффлера правильно: мы должны знать о некоторых высокоуровневых сентенциальная структур, которые могут опираться на вызовы методов и ценностей, и тому подобное.

Я вижу, что происходит с КОНЦЕПТУАЛЬНОЙ точки зрения: нам не нужно погрязнуть ни в каком «y.output» nitty-gritty. Все проистекает из вашего отказа от разделения аргументов на вызов метода запятыми. Кроме того, я хотел бы узнать, почему вы собираете свой список аргументов правильно-рекурсивно, а не лево-рекурсивно.

В чем разница между '(' и T_LPAREN и между ')' и T_RPAREN? Ли lex возвращает один в одном случае, другой в другом случае? Мне кажется, что простой шаблон \ (не может быть сопоставлен с обоими из них, но только с одним, то же касается шаблона \). Кроме того, для удобства чтения не нужно определять, например, T_LSB, где «[» будет работать отлично.