Quand j'essaie de compiler mon code dans yacc & lex Je reçois cette erreur: utilisation 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
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
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. –
J'ai écrit que im utilisant flex et bison, mais maintenant im ajouté les versions. –