Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > интерпритатор Python'а с помощью flex/bison


Автор: toshun 8.6.2009, 02:15
Здравствуйте, уважаемые программисты.
Пишу подмножество интепритатора 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      


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

Автор: xvr 8.6.2009, 16:49
Все же наверное не %token <dual> STRING "string" а %type <dual> STRING?
Да и сам dual в %union как то странно описан


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)