Здравствуйте, уважаемые программисты. Пишу подмножество интепритатора 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; } }
|
ругается на строчку
и пишет
| Код |
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
|
В чем моя ошибка? и как сделать чтобы токен мог принимать и строку и число? |