[解決済み] error: '{' トークンの前に '=', ', ';', 'asm' または '__attribute__' が必要
2022-02-13 05:39:44
質問
私は、単純なコード化されたプログラムであると仮定したテキストファイルを解析するプロジェクトに取り組んでいます。問題は、プログラムをコンパイルしようとすると、このエラーが発生することです。
In file included from driver.c:10:
parser.c: In function ‘Statement’:
parser.c:24: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:153: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:159: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:167: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:176: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:185: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:194: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:201: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
parser.c:209: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
driver.c:19: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
driver.c:50: error: old-style parameter declarations in prototyped function definition
driver.c:50: error: expected ‘{’ at end of input
このエラーに慣れていないので、修正する方法がわかりません。
以下は、エラーが発生している私の parser.c ファイルです。
#include <stdio.h>
#include <stdlib.h>
#include "parser.h"
AST_NODE* Program(AST_NODE* node);
AST_NODE* Statement(AST_NODE* node)
AST_NODE* AssignStmt(AST_NODE* node);
AST_NODE* Print(AST_NODE *node);
AST_NODE* Repeat(AST_NODE* node);
AST_NODE* Exp(AST_NODE* node);
AST_NODE* Factor(AST_NODE* node);
AST_NODE* Term(AST_NODE* node);
AST_NODE* parser(TOKEN* token,AST_NODE* node, FILE* input_file)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
if(token->type == Id)
{
temp-> tok = token;
node -> child1 = temp;
return node
}else
if(token->type == keyword)
{
if(strcmp(node->attribute, "print") == 0)
{
temp -> type = print;
node -> child1 = temp;
return node;
}
else if(strcmp(node->attribute, "repeat") == 0)
{
temp -> type = repeat;
node -> child1 = temp;
return node;
}
return node->prev;
}else
if(token->type == num)
{
temp->type = factor;
temp->tok = token;
AST_NODE temp2 = Exp(Term(temp));
node-> child3 = temp2
return node;//back to ID->term->exp then to either print repeat or assignment
}else
if(token->type == addOp)
{
temp-> tok = token;
node-> child2 = temp;
return node;
}else
if(token->type == multOp)
{
temp-> tok = token;
node-> child2 = temp;
return node;
}else
if(token->type == assignment)
{
temp->type = assignStmt;
temp->tok = token;
node->child2 = temp;
return node;
}else
if(token->type == semicolon)
{
temp-> type = assignStmt;
temp-> tok = token;
if(node->type == keyword)
{
node->child3 = temp;
}else
{
node->child4 = temp;
}
return node;
}else
if(token->type == lparen)
{
temp -> tok = token;
if(node->type == repeat)
node->child2 = temp;
else
node->child1 = temp;
return node = node->prev;
}else
if(token->type == rparen)
{
temp -> tok = token;
if(node->type == repeat)
node->child4 = temp;
else
node->child3 = temp;
return node;
}else if(token->type == newLine)
{
while(node->type != program)
{
node = node->prev;
}
return node;
}else{
if(token->type == Id)
{
AST_NODE temp2 = AssignStmt(Program(node));
temp->type = Id;
temp->tok = token
temp->prev = temp2;
temp2-> child1 = temp;
return temp2;
}else if(strcmp(token->attribute,"print"))
{
AST_NODE temp2 = Print(Program(node));
temp->type = print;
temp->tok = token
temp->prev = temp2;
temp2-> child1 = temp;
return temp2;
}else if(strcmp(token->attribute,"repeat"))
{
AST_NODE temp2 = Repeat(Program(node));
temp->type = repeat;
temp->tok = token
temp->prev = temp2;
temp2-> child1 = temp;
return temp2;
}
printf("error");
return NULL;
}
}
AST_NODE* Program(AST_NODE* node)
{
node->type = program;
Statement(node);
return node;
}
AST_NODE* Statement(AST_NODE* node)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
temp-> type = statement;
temp-> prev = node;
node->child1-> temp;
return temp;
}
AST_NODE* AssignStmt(AST_NODE* node)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
temp->type = assignStmt;
temp-> prev = node;
node->child1-> temp;
return temp;
}
AST_NODE* Print(AST_NODE* node)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
temp->type = print;
temp-> prev = node;
node->child1-> temp;
return node;
}
AST_NODE* Repeat(AST_NODE* node)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
temp->type = repeat;
temp-> prev = node;
node->child1-> temp;
return node;
}
AST_NODE* Exp(AST_NODE* node)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
temp->type = exp;
temp->child1-> node;
return temp;
}
AST_NODE* factor(AST_NODE* node)
{
AST_NODE Temp = malloc(sizeof(AST_NODE*));
temp->type = factor;
node->child1-> temp;
return temp;
}
AST_NODE* Term(AST_NODE* node)
{
AST_NODE temp = malloc(sizeof(AST_NODE*));
temp->type = term;
temp->child1-> node;
return temp;
}
以下は、私のdriver.cファイルで、エラー "プロトタイプ関数定義の古いスタイルのパラメータ宣言は、input"の最後に '{' を期待される、というエラーが発生します。これもまた、私は非常に不慣れなのです。
#include <stdio.h>
#include "parser.c"
#include "parser.h"
AST_NODE* parser(TOKEN* token,AST_NODE node, FILE *input_file);
int main(void)
{
TREE *current = 0;
FILE *input_file = fopen("test.txt", "r");
TOKEN *token = (TOKEN*) malloc(sizeof(TOKEN));
TOKEN *tok = (TOKEN*) malloc(sizeof(TOKEN));
AST_NODE* node = malloc(sizeof(AST_NODE));
while(!feof(input_file))
{
token = scan(input_file);
if(token->type != null)
{
parser(token,node,input_file);
printf("%s", token->attribute);
if(token->checkR == ';')
{
tok->type = semicolon;
tok->attribute = ";";
parser(tok,node,input_file);
}if(token->checkR == ')')
{
tok->type = rparen;
tok->attribute = ")";
parser(tok,node,input_file);
}
}
}
fclose(input_file);
return 0;
}
ここでは、TOKEN と AST_NODE を宣言してツリーを作成し、ツリーを埋めるためのトークンを形成しています。
#ifndef _parser_h
#define _parser_h
typedef enum token_type
{
null,
Id,
keyword,
num,
addOp,
multOp,
assignment,
semicolon,
lparen,
rparen,
newLine
}TOKEN_TYPE;
typedef struct token{
int type;
char *attribute;
char checkR;
}TOKEN;
typedef enum node_type
{
program,
statement,
assignStmt,
print,
repeat,
exp,
factor,
term
}NODE_TYPE;
typedef struct ast_node{
NODE_TYPE type;
TOKEN *tok;
struct AST_NODE *prev;
struct AST_NODE *child1;
struct AST_NODE *child2;
struct AST_NODE *child3;
struct AST_NODE *child4;
struct AST_NODE *child5;
}AST_NODE;
#endif
もう一つscanner.cというファイルがありますが、これは完璧に動作していることが分かっています。なぜなら、考えられるすべての入力でテストし、何の問題も発生しなかったからです。
もし、どなたか助けてくださる方がいらっしゃいましたら、とても感謝しています。
解決方法は?
AST_NODE* Statement(AST_NODE* node)
はセミコロンがありません(大きな手がかりは、エラーメッセージ "関数 'Statement' の中: ...")、24行目も同様です。
return node
(それらを修正すると、他の問題が発生します。そのいくつかは、ここで他の人が言及しています)。
関連
-
[解決済み】strcmpが機能しない
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み] テスト
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】__attribute__((constructor))は具体的にどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】Cygwin - Makefile-error: ターゲット `main.o' のレシピに失敗しました。
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み] テスト
-
[解決済み】警告:式の結果が未使用の場合