Wenn ich meinen Code bei dem Versuch, yacc & lex zu kompilieren bekomme ich diesen Fehler: Verwendung yytext in Bison Code
yacc Code:
%{
#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;
}
und der lex-Code
%%
[0-9]+ return NUM;
\+ return PLUS;
\- return MINUS;
%%
Wenn ich versuche, den Yytext zu $ 1 zu ändern, wird kompiliert, aber wenn ich den Code ausführe und zum Beispiel 5 + 6 schreibe, heißt das: (segmentation fault (core dumped))
mit ubuntu 64:
lex kompilieren mit Flex-Version lex 2.6.0:
lex subProject.lex
und yacc mit Bison Version Bison (GNU Bison) kompilieren 3.0.4:
yacc subProject.yacc
und der Fehler Hersteller:
cc subProject -o y.tab.c -ll -Ly
Veröffentlichen Sie hier keine Links oder Bilder von Text. Veröffentlichen Sie den Text. Es ist eine völlige Verschwendung von Zeit, die mir egal ist, und unsere Bandbreite, die ich mache. – EJP
Ist die "yacc", die du eigentlich verwendest, Bison verkleidet? Was bekommst du von 'yacc --version'? Und ist das "Lex", das Sie tatsächlich verwenden, Flex in Verkleidung? Was bekommst du von 'lex --version'? Es kann wichtig sein; Original AT & T Yacc und Lex unterscheiden sich geringfügig von Bison und Flex (und beachten Sie, dass das Etikett für dieses Flex [Tag: flex-lexer] nicht [tag: flex] ist; das andere für Adobe Flex). Und ein Unterschied ist die Art von 'yytext'. Die Deklaration vs. keine Deklaration kann jedoch ein separates Problem sein - außer dass es wichtig ist, die richtige Deklaration zu verwenden. –
Ich schrieb, dass ich Flex und Bison benutze, aber jetzt habe ich die Versionen hinzugefügt. –