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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.