일종의 고전적인 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");
}
불행하게도,'std :: string'은 POD 타입이 아니기 때문에 C++ 11 이전에는 union에 넣을 수 없었습니다. 그렇다고해도 들소가 생성하지 않기 때문에 작동하지 않을 것입니다. 노동 조합에 대한 필요한 복사 책임자와 대입 연산자. –
@ChrisDodd, 좋은 지적. 모든 경고를 작성하는 대신 제안을 삭제합니다. – rici