Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> интерпритатор Python'а с помощью flex/bison 
:(
    Опции темы
toshun
Дата 8.6.2009, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 10.2.2006

Репутация: нет
Всего: нет



Здравствуйте, уважаемые программисты.
Пишу подмножество интепритатора Python'а, а именно: операции с числами и присваивание их переменным, работа со списками и со строками.
Лексический и синтаксический анализатор написал, но возникла проблема: token'ы воспринимает один формат только double, а мне нужно еще чтобы и string воспринимал нормально. При 
lex.l
Код


\"[[:alpha:][:digit:]_\ \,\.]*\" yylval->name = new std::string(yytext); return yy::Parser::token::STRING;
\'[[:alpha:][:digit:]_\ \,\.]*\' yylval->name = new std::string(yytext); return yy::Parser::token::STRING; 
[A-Za-z][A-Za-z[:digit:]_]*   yylval->name = new std::string(yytext); return yy::Parser::token::NAME;    


parser.y

Код

term : NUMBER { $$ = $1; } 
| STRING{ $$ = $1; } 
| NAME { StringPtr p($1);
  Driver::Symbols::const_iterator i = driver.symbols.find(*p);
  if(i != driver.symbols.end())
    $$ = i->second.value;
  else
  {
    std::ostringstream msg;
    msg << "undefined symbol '" << *p << "'";
    error(@1, msg.str());
    YYABORT;
  }
    }       

ругается на строчку 

Код

| STRING{ $$ = $1; } 

и пишет
Код


src/parser.y:146.21-22: $1 из `term' не имеет описанного типа


Типы я описал так
Код


%union {
    double value;
    std::string* name; 
    union dual;
}

%code {
#include <memory>
    
#include "driver.h"

typedef std::auto_ptr<std::string> StringPtr;
}

%token CONST "const" 
%token END 0 "end of file" 
%token INVALID_CHARACTER "invalid character"
%token NOT_A_NUMBER "not a number"
  
%token <name> NAME "identifier"
%token <value> NUMBER "number"
%token SET
%token <dual> STRING "string"
%token LIST "list"
%token APPEND "append"
%token EXIT
%token DEL "del"
%token PLUS "+"
%token MINUS "-"
%token EQUAL "="
%token MORE ">"
%token LESS "<"
%token MULTI "*"
%token DIV "\\"
%token COMMA ","  
%token OPENBRACKET "("
%token CLOSEBRACKET ")"
%token OPENREG "]"
%token CLOSEREG "["
%left '+' '-' '=' '*' '/';  

%type <value> expr 
%type <value> term
%type <value> expression_stm
%type <value> name_stm
%type <value> list_stm del_stm append_stm exit_stm      


В чем моя ошибка? и как сделать чтобы токен мог принимать и строку и число?

Это сообщение отредактировал(а) toshun - 8.6.2009, 02:18
PM MAIL   Вверх
xvr
Дата 8.6.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Все же наверное не %token <dual> STRING "string" а %type <dual> STRING?
Да и сам dual в %union как то странно описан


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.