Bison, похоже, не распознает строковые литералы C должным образом.

StackOverflow https://stackoverflow.com/questions/699054

Вопрос

Моя проблема в том, что я пытаюсь запустить задачу, которую я закодировал с помощью сканера-парсера flex-bison.Моя программа должна принимать вводимые пользователем данные (в моем случае запросы к системе баз данных, которую я проектирую), лексировать и анализировать, а затем выполнять соответствующие действия.На самом деле происходит то, что мой код синтаксического анализатора неправильно интерпретирует строковые литералы, которые я ему передаю.

Вот мой код:

130 insertexpr :  "INSERT" expr '(' expr ')'
131 
132                  {
133                         $$ = new QLInsert( $2, $4 );
134                          }
135                         ;

И мой вклад после «Запроса:" быстрый:

Запрос:ВСТАВИТЬ abc(5);
ввод: 1.0-5:синтаксическая ошибка, неожиданная строка, ожидание конца файла или конца строки, INSERT или ';'

Теперь, если я удалю строковый литерал «INSERT» из моего кода parser.yy в строке 130, программа будет работать нормально.Фактически, после сохранения входных данных (а именно «abc» и целого числа 5) они вернулись ко мне правильно.

Сначала я подумал, что это проблема с кодировками символов.Код Bison необходимо компилировать и запускать с использованием одних и тех же кодировок, что не должно быть проблемой, поскольку я компилирую и запускаю с одного и того же терминала.

Детали моей системы:

Ubuntu 8.10 (универсальная версия Linux 2.6.24-16)
гибкий 2.5.34
бизон 2.3
gcc 4.2.4

Если вам нужна дополнительная информация или код, дайте мне знать!

Это было полезно?

Решение

Это классическая ошибка: если вы используете flex для преобразования входных данных в токены, вы не должны ссылаться на литеральные строки в синтаксическом анализаторе как на литеральные строки, а вместо этого использовать для них токены.

Подробности см. этот похожий вопрос

Другие советы

Спасибо, спасибо, спасибо!

Чтобы внести ясность, вот как я реализовал свое решение, основываясь на комментариях jpalecek.Сначала я объявил токен INSERT в коде bison (parser.yy):

71 %token INSERT

Затем я определил этот токен в гибком коде (scanner.ll):

79 "INSERT INTO" { return token::INSERT; }

Наконец, я использовал токен INSERT в своем грамматическом правиле:

132 insertexpr :  INSERT expr '(' expr ')'
133 
134                  {
135                         $$ = new QLInsert( $2, $4 );
136                          }
137                         ;

И вуаля!моя чрезмерно продолжительная головная боль наконец-то прошла!

Спасибо, jpalecek :).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top