0

私は文法を持っています:

%token T_SHARE
%token T_COMMENT T_PUBLIC T_WRITEABLE T_PATH T_GUESTOK T_VALID_USERS
       T_WRITE_LIST T_CREATE_MODE T_DIRECTORY_MODE
%union
{
    int number;
    char *string;
}

%token <string> T_STRING
%token <number> T_NUMBER T_STATE

%%

parameters:
   |parameters parameter
       ;
parameter:
   section_share
       |comment
....
section_share:
       '[' T_SHARE ']' {section_print(T_SHARE);}
   ;
comment:
   T_COMMENT '=' T_STRING {print(2);parameter_print(T_COMMENT);}
       ;

関数 print は次のとおりです。 void print(int arg) { printf("%d\n", arg); }

しかし、print の引数 `2' を "8508438" のような他の値にルールなしで出力します。なぜ?

4

1 に答える 1

0

何を尋ねようとしているのかを理解するのは非常に難しいですが、トークンの数値コードと意味値を混同していると思います。特に、print(2)'comment' ルールに関連付けられたアクションの呼び出しについて特別なことは何もありません。これは、生成されたパーサーに文字どおりにコピーされるため、関数の定義が与えられると、print()そのルールが起動するたびに文字どおりの '2' が出力されます。それがあなたが観察していると言うことだと思います。

代わりに、ルール内のシンボルに関連付けられたセマンティック値を出力したい場合、構文は$nの形式になります。ここで、ドル記号の後の数字は、ルール内で必要なシンボルの番号で、1 から数えます。したがって、 「コメント」ルールでは、T_STRING シンボルに関連付けられたセマンティック値を として参照できます$3。例えば:

comment:
    T_COMMENT '=' T_STRING { printf("The string is %s\n", $3); }
;

プリミティブ トークンのセマンティック値は、使用できるように字句解析器によって設定する必要があります。非終端記号のセマンティック値は、文法のアクションによって設定する必要があります。また、ルール中のアクションがカウントに含まれることにも注意してください。

your などのトークン シンボルT_COMMENTをアクションで直接使用することはできますが、これは通常は役に立ちません。これらのシンボルは、C プリプロセッサによって特定のシンボルに固有の数値に解決されます。結果のトークン コードは、解析された特定の値とは関係ありません。

于 2013-10-28T22:21:11.750 に答える