2014-01-22 5 views
0

Ссылаясь на этот blog postСоюз в C++ используется в контексте Bison

Существует союз определяется следующим образом:

%union { 
    Node *node; 
    NBlock *block; 
    NExpression *expr; 
    NStatement *stmt; 
    NIdentifier *ident; 
    NVariableDeclaration *var_decl; 
    std::vector<NVariableDeclaration*> *varvec; 
    std::vector<NExpression*> *exprvec; 
    std::string *string; 
    int token; 
} 

Мой вопрос: Как этот союз может быть использован, когда он анонимным и как это было на самом деле использовано?

ответ

1

Не путайте директиву bison %union с синтаксисом C/C++.

В коде, созданном бизонов, будет C/C++ union, тело которого копируется из %union директивы, но это, конечно, не является анонимным: его зовут YYSTYPE. Однако вам вряд ли когда-либо нужно это знать, поскольку единственная открытая переменная с этим типом - yylval. (Внутренний бизонный стек также состоит из элементов типа YYSTYPE, но он не подвергается действию кода пользователя.)

Существуют различные другие возможные способы определения YYSTYPE, как описано в руководстве по бизону. Например, вы можете создать свой собственный C/C++ union (или struct), как описано here. Однако эти усовершенствованные функции bison редко требуются.

Смежные вопросы