나는 Bison을 처음 사용했습니다. 파서를 구현하려고합니다. 내가 직면 한 주된 문제는 파스 트리이다. 내가 제거 할 수없는 나무와 관련된 오류가 나타납니다. 그것은 "unknown type name 'tree'"라고 말합니다. 여기에 내 y 파일이 있습니다. 아무도 내가 이것을 해결할 수 있다면 기뻐할 것입니다. 파서가 너무 심하게 필요합니다. 미리 감사드립니다.Bison을 사용하여 구문 분석 트리
%{
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
fprintf(stderr,"error FAIL: %s\n",str);
}
int yywrap()
{
return 1;
}
enum treetype {operator_node, variable_node};
typedef struct tree {
enum treetype nodetype;
union {
struct {struct tree *left, *right; char operator;} an_operator;
char *a_variable;
} body;
} tree;
static tree *make_op (tree *l, char o, tree *r) {
tree *result= (tree*) malloc (sizeof(tree));
result->nodetype= operator_node;
result->body.an_operator.left= l;
result->body.an_operator.operator= o;
result->body.an_operator.right= r;
return result;
}
static void printtree (tree *t, int level) {
#define step 4
if (t)
switch (t->nodetype)
{
case operator_node:
printtree (t->body.an_operator.right, level+step);
printf ("%*c%c\n", level, ' ', t->body.an_operator.operator);
printtree (t->body.an_operator.left, level+step);
break;
case variable_node:
printf ("%*c%c\n", level, ' ', t->body.a_variable);
}
}
%}
%union {
char* a_variable;
tree* a_tree;
}
%start file
%token <a_variable> TOKDIGIT TOKFLOAT TOKID TOKSEMICOLON TOLCOLON TOKCOMMA TOKUNRECOG TOKCOMMENT TOKDOT TOKMINUS TOKCOLON
%type <a_tree> field object file ID
%right TOKMINUS
%%
file :
| object file { printtree($1, 1); }
;
object : field object {$$ = make_op($1, '', $2);}
| field {$$ = $1 ; }
;
field : ID TOKCOLON field {$$ = make_op ($1, ':', $3); }
| ID TOKCOMMA field {$$ = make_op ($1, ',', $3); }
| ID TOKSEMICOLON field {$$ = make_op ($1, ';', $3); }
;
ID : TOKID { $$ = $1; }
;
%%
내가 제안한 변경 사항을 적용했지만 tab.c 파일을 컴파일하려고해도 "unknown type name 'tree'"오류가 계속 표시됩니다. 이것은 문법이 지금과 같은 모습입니다 : 'file :/* empty */{return NULL; } | 필드 파일 {printtree ($ 1, 1); NULL을 반환; } ; 필드 : ID TOKCOLON 필드 {$$ = make_op ($ 1, ':', $ 3); } | ID TOKCOMMA 필드 {$$ = make_op ($ 1, ',', $ 3); } | ID TOKSEMICOLON 필드 {$$ = make_op ($ 1, ';', $ 3); } |/* empty */{NULL을 반환; } ; ID : TOKID {$$ = $ 1; } ; ' –
문제는 다른 곳에서 발생합니다. 'tree' typedef 이름에 대한 C 프로그래밍 오류와 같습니다. 'yacc'에서 오류 메시지가 더 이상 나오지 않습니까? – Kaz
'tree' 타입은 아마 헤더 파일에 정의되어야합니다. Yacc이'YYSTYPE' 구문 분석 노드 유형을 생성하기 위해 사용하는 Yacc'% union '에서'tree'를 사용합니다. 'yacc -d'를 실행하면'YYSTYPE'이 선언 된'y.tab.h' 헤더 파일을 생성합니다. '% union'이'tree' 타입을 정의하면'YYSTYPE'은'tree' 타입의 멤버를 갖습니다. 'y.tab.h'를 포함하는 사람은 어딘가에서'tree'의 정의를 포함해야합니다. 그렇지 않으면'YYSTYPE' 선언이 정의되지 않은 타입을 참조 할 것입니다. – Kaz