2016-12-20 14 views
0

나는이 오류 얻을은 yacc에 & 렉스를 내 코드를 컴파일하려고 : this error사용 yytext에서

은 yacc 번호 :

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define YYSTYPE struct node* 
typedef struct node{ 
    char *token; 
    struct node *left; 
    struct node *right; 
} node; 
node* mknode(char* token, node *left, node *right); 
void Printtree(node *tree); 
int yyerror(); 
%} 
%token NUM PLUS MINUS 
%left PLUS MINUS 
%% 
S:exp {printf("OK\n"); Printtree($1);}; 
exp:exp PLUS exp {$$=mknode("+",$1,$3);} 
    | exp MINUS exp{$$=mknode("-",$1,$3);} 
    | NUM {$$=mknode(yytext, NULL, NULL);}; 
%% 
#include "lex.yy.c" 
int main(){ 
    return yyparse(); 
} 
node *mknode (char *token, node *left, node *right){ 
    node *newnode = (node*)malloc(sizeof(node)); 
    char *newstr = (char*)malloc(sizeof(token)+1); 
    strcpy (newstr, token); 
    newnode->left=left; 
    newnode->right=right; 
    newnode->token=newstr; 
    return newnode; 
} 
void Printtree(node* tree){ 
    printf("%s\n", tree->token); 
    if (tree->left) 
     Printtree(tree->left); 
    if (tree->right) 
     Printtree(tree->right); 
} 
int yyerror(){ 
    printf("ERROR\n"); 
    return 0; 
} 

와 렉스 코드

%% 
[0-9]+ return NUM; 
\+ return PLUS; 
\- return MINUS; 
%% 

내가 $ 1로 yytext를 변경하려고 할 때 컴파일되지만 코드를 실행하고 예를 들어 5 + 6을 말하면 : (세분화 오류 (코어 덤프 됨))

우분투 (64)를 사용하여 :

렉스 플렉스 버전 렉스 2.6.0 컴파일 :

yacc subProject.yacc 
:

lex subProject.lex 

와 Yacc에 들소 버전 들소 (GNU 들소) 3.0.4 컴파일

및 오류 메이커 :

cc subProject -o y.tab.c -ll -Ly 
+2

여기에 텍스트에 대한 링크 또는 그림을 게시하지 마십시오. 텍스트를 게시하십시오. 그것은 내가 신경 쓰지 않는 시간의 완전한 낭비이며 우리의 대역폭입니다. – EJP

+0

당신이 실제로 사용하고있는 'yacc'가 실제로 들소인가요? 'yacc --version'에서 무엇을 얻습니까? 플렉스를 실제로 사용하고있는 '렉스'입니까? 'lex - 버전'에서 무엇을 얻습니까? 그것은 중요 할 수 있습니다. 원래 AT & T Yacc와 Lex는 Bison과 Flex와 약간 다릅니다 (이 Flex의 태그는 [tag : flex-lexer]가 아니고 [tag : flex]이고 다른 하나는 Adobe Flex 용임). 그리고 하나의 차이점은'yytext'의 유형입니다. 그러나 선언은 별도의 문제 일 수 있습니다. 단, 올바른 선언을 사용하는 것이 중요합니다. –

+0

나는 flex와 bison을 사용하여 그 글을 썼지 만 지금은 버전을 추가했다. –

답변

2

yytext을 문법 규칙에 사용하면 안됩니다. 당신이 가질 수 있다고 생각하는 가치가 항상있는 것은 아닙니다. 그것을 필요로하는 다른 규칙에 대한

[0-9]+ { yylval.text = strdup(yytext); return NUM; } 

와 마찬가지로 다음과 같이 파서에서 사용 : 당신은 스캐너에 yyunion에 저장해야 일반적인 기법을 사용하여

| NUM {$$=mknode($1, NULL, NULL);} 

YYUNION을 선언하고 노드를 입력하십시오.

+0

변경 사항을 적용하고 새로운 오류가 발생했습니다 : 'yylex'함수에서 : 구조체 또는 공용체가 아닌 'text'멤버를 요청합니다. –

+0

나는 이것을 다음과 같이 사용한다 : [0-9] + {yylval = strdup (yytext); NUM을 반환합니다. } 그리고 그것은 thnks 일했습니다. –

+0

그래서 위에서 말한 것처럼'text'를 공용체의 멤버로 선언해야합니다. yyunion을 사용하는 방법과 구문 분석 트리 노드를 강력하게 입력하는 방법을 조사해야합니다. 장기적으로 도움이 될 것입니다. – EJP