2013-03-11 1 views
1

일종의 고전적인 bison/flex 계산기 구현 문제에 대해 연구하고 있습니다. 내가 실행 한 문제는 변수 할당입니다. 그것은 처음에는 효과가있는 것처럼 보입니다. 오직 선언 된 변수 만 참조 할 수 있습니다. 할당 된 값을 기억합니다 ... 모든 변수가 각각의 값을 공유하지 않고 단일 값을 공유하는 것만 다를뿐입니다. 그래서 만약 내가 "x = 3; y = 5;" x와 y는 모두 5의 값을 갖습니다.들소의 해시 조회에 문제가 발생했습니다.

분명히 저는 잘못하고 있습니다 만, 이것이 들소, C++ 또는 unordered_map 데이터 구조가 어떻게 작동하는지 이해하지 못했습니다. (또는 아마도 3 개 모두)

나는 아래 코드의 모든 관련 부분을 포함했다고 생각하지만 누락 된 부분이 있으면 알려주십시오.

%{ 

    #include <iostream> 
    #include <string> 
    #include <unordered_map> 
    using namespace std; 

    unordered_map<string, double> dict; 
%}  

%union { 
    double dval; 
    char *sval; 
} 

%token <sval> VARIABLE 
%token <dval> NUMBER 
%type<dval> expr 

%% 

assign: 
    VARIABLE '=' expr {dict[$1] = $3; cout << $1<< "="<<dict[$1]<<endl; } 
expr: VARIABLE { 
    if(dict.find($1) == dict.end()) 
    { 
     yyerror("Bad Var"); 
    } 

답변

0

그래서 내 문제는 데이터를 저장하는 방법이 아니라 단지 검색하는 것이 었습니다. 실제로 expr의 값을 설정하기 위해 else 문을 추가해야했습니다.

expr: VARIABLE { 
    if(dict.find($1) == dict.end()) 
    { 
     yyerror("Bad Var"); 
    } 
    else { //Needed this section 
     $$ = dict[$1] 
    } 
}  

나는 내가 그렇게 할 필요가 알고 그냥 잊어 생각하지만, 값을 복용 EXPR의 행동은 무엇이든 가장 최근에 할당 된 변수는 나에게 던졌다 꺼져 있습니다.

2

당신은 정말뿐만 아니라 당신의 플렉스 코드를 표시해야합니다,하지만 난 관련 비트 이런 식으로 뭔가 보이는 같은데요 :

{id}  { yylval.sval = yytext; return VARIABLE; } 

당신이해야 할 것은 :

{id}  { yylval.sval = strdup(yytext); return VARIABLE; } 

그런 다음 들소 작업에서 사용한 문자열을 할당 해제하여 메모리가 누출되지 않도록해야합니다.

the flex manualthe bison manual을 참조하십시오.

+0

불행하게도,'std :: string'은 POD 타입이 아니기 때문에 C++ 11 이전에는 union에 넣을 수 없었습니다. 그렇다고해도 들소가 생성하지 않기 때문에 작동하지 않을 것입니다. 노동 조합에 대한 필요한 복사 책임자와 대입 연산자. –

+0

@ChrisDodd, 좋은 지적. 모든 경고를 작성하는 대신 제안을 삭제합니다. – rici

관련 문제