Зубр, кажется, не распознает строковые литералы C должным образом - PullRequest
1 голос
/ 31 марта 2009

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

Вот мой код:

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

И мой ввод, следуя подсказке "Query:":

Запрос: INSERT abc (5);
input: 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

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

Ответы [ 2 ]

3 голосов
/ 31 марта 2009

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

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

0 голосов
/ 31 марта 2009

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

Просто чтобы уточнить, вот как я реализовал свое решение, основываясь на комментариях от jpalecek. Сначала я объявил токен INSERT в коде зубра (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:).

...