LINUX.ORG.RU

Трудности с Yacc

 


0

1

Добрый день.

Такой код работает:

input:
     | input line
     ;

line: '\n'
    | query '\n'
    ;

query: tuple_heading
     ;

tuple_heading: TUPLE '{' attributes_commalist '}'
             ;

attributes_commalist: attribute
                    | attributes_commalist ',' attribute
                    ;

attribute: attribute_name
         ;

attribute_name: ID
              ;

Потом меняю tuple_heading на:

tuple_heading: ID ASSIGN TUPLE '{' attributes_commalist '}'

И всё валится. ID и ASSIGN объявлены; если «ID ASSIGN» вставить перед query, то всё работает отлично. Получается, я как-то неверно использую yacc.

Что делаю не так?

Ответ на: комментарий от xaizek

Что именно и как?

Хороший вопрос. Пишу на новом для себя языке, отладка идёт плохо.

Скажите, добавление «ID ASSIGN» ничего не должно ломать?

lochness ☆
() автор топика
Ответ на: комментарий от lochness

Оно собралось? Зависло? Упало после запуска? Показало ошибку разбора? Разобрало не так? Я в этом смысле спрашивал.

Я не вижу, почему «ID ASSIGN» могло бы на что-то повлиять. Если это вся грамматика, то конфликтам взяться неоткуда.

Кстати в

input:
     | input line
     ;

bison же должен предлагать написать %empty явно.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Оно собралось? Зависло? Упало после запуска? Показало ошибку разбора? Разобрало не так? Я в этом смысле спрашивал.

Пишу на Go. Есть три файла: main.go, flex.l, yacc.y. flex нормально собрал свой файл, yacc собрал свой (ругани на проблемы с грамматикой не было, хотя ругаться умеет), go собрал получившиеся файлы в бинарь.

Бинарь запускается, часть грамматики отрабатывает, но валится с невнятной «syntax error» если скормить строку вышеозначенного формата.

Если это вся грамматика, то конфликтам взяться неоткуда.

Так же подумал.

Остаётся грешить на flex (в Go он свой), похоже.

lochness ☆
() автор топика
Ответ на: комментарий от lochness

Если yacc у них не свой, то можно добавить:

%define parse.error verbose
И в ошибке должно быть что-то вроде «получил такой-то токен, а хотел такой».

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Вы оказались правы. Помогло, спасибо.

lochness ☆
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.