2013-03-29 3 views
0

나는 들소에서 의미 분석을하고 있는데 토큰과 연관된 여러 속성을 사용하려고합니다. 내 코드의 관련 부분은 다음과 같습니다.들소의 다중 속성

%union semrec 
{ 
    int Type; 
    char *id; 

} 

%start prog 

%token <id> tIDENT 

여기에서 tIDENT 토큰과 함께 "id"속성 만 사용할 수 있습니다. 또한 "Type"속성을 tIDENT 토큰과 연관 시키려고합니다.

%token <id> tIDENT 
%token <Type> tIDENT 

를하지만 나에게 토큰 tIDENT에 대한 재 선언의 경고를 제공 이렇게하려면, 나는 다음 시도했다. 나는 또한 다음을 시도했다 :

%token <id> <Type> tIDENT 

또한 작동하지 않았다. 내가 무엇을 할 수 있을지? 나는 이것이 약간의 통사 적 문제라고 생각한다.

감사합니다.

답변

1

이렇게 할 수 없습니다. 복수의 "특성"이있는 모든 기호가 이러한 모든 "특성"을 정의하는 struct을 가지도록 %union을 정의해야합니다.

%union 
{ 
    struct 
    { 
    int type; 
    char *id; 
    } type_id; 
} 
%type <type_id> tIDENT 

나는 매우 의심의 여지가 당신이 옳은 일을하고 있다는 것을 그러나 $1.type 또는 $1.id

사용 주와 같은 뭔가. AST (Abstract Syntax Tree)가 필요할 가능성이 높습니다. 그것에 대한 정보를 찾아야합니다.

+0

고마워요,하지만 이번에는 다음과 같은 오류가 나타납니다. 스캐너에서 나는 다음과 같은 것을 가지고 있습니다 : [A-Za-z] [A-Za-z0-9] * {yylval.id = (char *) 이제 'YYSTYPE'에는 'id'라는 회원이 없습니다. –

+1

또한 'yylval.type_id.id = strdup (yytext)'와 같은 스캐너를 조정해야합니다. 그리고 의미 론적 가치에 대한 Bison의 문서를 철저히 읽어야합니다. – akim

+0

이제 내가 [A-Za-z] [A-Za-z0-9] * {yylval.type_id.id = (char *) strdup (yytext); return tIDENT;}로 바 꾸었습니다. 고마워요! –