2016-12-20 2 views
0

Quand j'essaie de compiler mon code dans yacc & lex Je reçois cette erreur: this errorutilisation yytext dans le code de bison

Code 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; 
} 

et le Code lex

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

quand j'essaye de changer le yytext à $ 1 est compilé mais quand je cours le code et tape par exemple 5 + 6 dit: (défaut de segmentation (noyau jeté))

utilisant ubuntu 64:

lex compiler avec la version 2.6.0 flex lex:

lex subProject.lex 

et yacc compiler avec bison version bison (Bison GNU) 3.0.4:

yacc subProject.yacc 

et le fabricant d'erreur:

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

Ne pas poster des liens vers, ou des images de, texte ici. Postez le texte. C'est une perte totale de temps, dont je ne me soucie pas, et de notre bande passante, ce que je fais. – EJP

+0

Est-ce que le '' yacc' 'que vous utilisez actuellement Bison est déguisé? Qu'est-ce que vous obtenez de 'yacc --version'? Et la '' Lex '' que vous utilisez est-elle réellement déguisée? Qu'est-ce que vous obtenez de 'lex --version'? Cela peut avoir de l'importance. AT & T Yacc et Lex sont légèrement différents de Bison et Flex (et notez que le tag pour ce Flex est [tag: flex-lexer] et non [tag: flex], l'autre pour Adobe Flex). Et une différence est le type de 'yytext'. Cependant, la déclaration vs pas de déclaration peut être un problème distinct - sauf qu'il est crucial d'utiliser la déclaration correcte. –

+0

J'ai écrit que im utilisant flex et bison, mais maintenant im ajouté les versions. –

Répondre

2

Vous ne devriez pas utiliser yytext dans les règles de grammaire du tout. Il n'aura pas toujours la valeur que vous pensez qu'il pourrait avoir. Vous devez enregistrer dans le yyunion dans le scanner:

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

et de même pour les autres règles qui en ont besoin, et ensuite l'utiliser dans l'analyseur comme ceci:

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

en utilisant les techniques habituelles pour déclarer le YYUNION et en tapant les noeuds.

+0

je fais ces changements et maintenant j'ai eu une nouvelle erreur: Dans la fonction 'yylex': demande de membre «texte» dans quelque chose pas une structure ou une union. –

+0

je l'utilise comme ceci: [0-9] + {yylval = strdup (yytext); renvoie NUM; } et cela a fonctionné thnks. –

+0

Vous devez donc déclarer 'text' en tant que membre de l'union, comme je l'ai dit plus haut. Vous devez regarder comment utiliser le yyunion et comment taper fortement vos noeuds d'arbre d'analyse. Cela vous aidera à long terme. – EJP