문제

나는 들소와의 연합의 일환으로 구조물을 포함 시키려고 노력하고 있지만 %Union의 'struct node args'에 오류가 발생합니다.

parser.y:17: error: field ‘args’ has incomplete type

코드:

struct node {
    char * val;
    struct node * next;
};

%}

%union {
    char * string;
    struct node args;
}

%token <string> CD WORD PWD EXIT

%type <args> arg_list

내가 뭘 잘못하고 있는지 아는 사람 있나요?

도움이 되었습니까?

해결책

더 나은 것은 "요구 사항"옵션과 함께 %코드 지침을 사용하십시오.

%code requires {
    struct node {
        char * val;
        struct node * next;
    };
}

%union {
    char * string;
    struct node args;
}

여기에는 Parser 소스 파일뿐만 아니라 Tab.h 파일의 "요구 사항"블록의 코드가 포함됩니다.

문서에서 : http://www.gnu.org/software/bison/manual/html_node/decl-summary.html#decl-summary

  • 필요합니다
    • 목적 : 이것은 Yystype 및 YylType에 필요한 종속성 코드를 작성하기에 가장 좋은 곳입니다. 다시 말해, 이는 %Union 지시문에서 참조 된 유형을 정의하기에 가장 좋은 장소이며 Bison의 기본 Yystype 및 YylType 정의를 무시하기 가장 좋은 장소입니다.

다른 팁

그것은 당신이 얻는 절름발이 y.tab.h 출력으로 이어집니다.

y.tab.h를 어디서나 포함시키기 전에 "구조 노드"가 정의되도록 하여이 문제를 해결해야합니다.

이렇게하려면 struct 정의로 파일 node.h를 만듭니다.

그런 다음 parser.l 파일, parser.y 파일에 y.tab.h를 포함하는 c 파일에 node.h를 포함 시키십시오. 이것은 약간 성가신 일입니다.

또는 어딘가에서 사용할 때까지 전체 유형을 알 필요가 없기 때문에 "구조 노드 아르"를 "구조 노드* args"로 변경할 수 있습니다. 이것이 코드에 맞는지 확실하지 않습니다.

어느 쪽이든 작동해야합니다.

어쩌면 더 간단 할 것입니다 (생각합니다) - 이것을 직접 사용했습니다.

%union {
  char   c; 
  struct {
     char name[30];
     int  type;
  } s;
}

그런 다음 Flex에서 "yylval.s.name"또는 "yylval.s.type"등을 사용할 수 있습니다. $$=0, $1=bla... 이제 쓸 수 있습니다 $<s.type>$=0 , $<s.type>1=bla...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top