0

私のプログラムは、以下を関数宣言として認識できるはずだと思います。

int fn(int i) { int n; return; }

しかし、そうではありません。

これが私のyaccファイルの関連部分です:

program : declaration_list ; 

declaration_list : declaration_list declaration | declaration ;

declaration : var_declaration 
            | fun_declaration 
            | '$' { printTable();};

var_declaration : type_specifier ID ';' {$2->value = 0; $2->arraysize = 0;};
                | type_specifier ID '[' NUM ']' ';' {$2->arraysize = $4;printf("Array size is %d", $2->arraysize);} ;

type_specifier : INT | VOID ;

fun_declaration : type_specifier ID '(' params ')' compound_stmt {printf("function declaration\n"); printf("Parameters: \n", $2->args); } ;


params : param_list | VOID ;

param_list : param_list ',' param
           | param ;

param : type_specifier ID | type_specifier ID '[' ']' ;

compound_stmt : '{' local_declarations statement_list '}' {printf("exiting scope\n"); } ;

local_declarations : local_declarations var_declaration
                   | /* empty */ ;

statement_list : statement_list statement
               | /* empty */ ;

statement : expression_stmt
          | compound_stmt
          | selection_stmt
          | iteration_stmt
          | return_stmt ;

expression_stmt : expression ';'
                | ';' ;

selection_stmt : IF '(' expression ')' statement
               | IF '(' expression ')' statement ELSE statement ;

iteration_stmt : WHILE '(' expression ')' statement ;

return_stmt : RETURN ';' | RETURN expression ';' ;

なぜそれを認識しないのですか?

4

3 に答える 3

1

これはあなたの質問への回答ではなく、デバッグの提案です。

printf各ルールの後に、ルールが一致したことを示すステートメントを追加します。ヒントについては、こちらの私の回答をご覧ください。次に、文法を通して入力を実行し、それが何をしているかを確認します。

質問するためのもう 1 つのヒントは、エラーを再現する最も単純なケースに問題を減らしてみることです。上記の文法の場合、投稿する前に、この特定の例に一致するとは思わないすべての規則を取り除いてください。また、%token宣言を含む完全なプログラムを投稿して、人々がそれをコンパイルして自分で試すことができるようにします。さらに良いのは、レクサーも投稿することです。

于 2009-11-25T07:56:29.403 に答える
0

次のようなものが必要だと思います:

declaration : type_specifier ID ';' {$2->value = 0; $2->arraysize = 0;};
            | type_specifier ID '[' NUM ']' ';' {$2->arraysize = $4;printf("Array size is %d", $2->arraysize);} ;
            | type_specifier ID '(' params ')' compound_stmt {printf("function declaration\n"); printf("Parameters: \n", $2->args); } ;

            | '$' { printTable();};

type_specifier : INT | 空所 ;

于 2009-11-24T12:13:36.667 に答える
-1

あなたが持っている行を見ただけです

local_declarations : local_declarations var_declaration
                   | | /* 空の */ ;

あなたはそれを再帰的なステートメントのように持っているので、その行は私には面倒に見えます...

これがヒントになることを願っています。よろしくお願いします、トム。

于 2009-11-24T11:12:29.833 に答える