0

これがyacc file.yの私のトップです

%code requires {

    struct Id {
        char *var;
    };

    struct Commds;

    struct Commd {
        struct Id lhs;
    };

    struct Commds {
        struct Commd commd;
        struct Commds *next;
    };    
}

このコードを使用して%union、パーサーの新しい型を定義しました。

%union {
    char *id;    
    long long integer;  
    struct Id Identifier;
    struct Commd Command;
    struct Commds *Commands;         
}
....
%type <Command> command
%type <Commands> commands

$$レクサーからのトークンを評価している間に解析ツリーが構築されている間、 -dollars 属性でそれを使用しても問題ありません。残念ながら、セクションの他のメソッドでファイルの先頭に定義されている構造を使用したいと思います%{ codes %}。残念ながら、次のように関数を定義するたびに:

void add(struct Commd cmd) {...}; 

エラーが表示されます: タイプが不明です! この構造体をパーサー全体から見えるようにする方法を教えていただければ幸いです。

4

1 に答える 1

0

このエラーは通常、ユニオン、トークン、および型があるために発生します。

%union {
    char *id;    
    long long integer;  
    struct Id Identifier;
    struct Commd Command;
    struct Commds *Commands;         
}
....
%type <Command> command
%type <Commands> commands

{% %}中括弧内の C コードの前。これを の後に置く必要があります{% %}。基本的に、端末または非端末に type があると言っていますが、ユニオンコードの下に含まれているためstruct Commd、yacc はそれが何であるかを知りません。struct Commd

あなたはコード全体を書いたわけではないので、あなたがこれをやったとしか思えません。その場合は、これがあなたの答えです。

于 2016-01-21T18:27:48.917 に答える