Bison, похоже, не распознает строковые литералы C должным образом.
-
22-08-2019 - |
Вопрос
Моя проблема в том, что я пытаюсь запустить задачу, которую я закодировал с помощью сканера-парсера 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 :).