2016-12-20 2 views
0

Wenn ich meinen Code bei dem Versuch, yacc & lex zu kompilieren bekomme ich diesen Fehler: this errorVerwendung 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 
+2

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

+0

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. –

+0

Ich schrieb, dass ich Flex und Bison benutze, aber jetzt habe ich die Versionen hinzugefügt. –

Antwort

2

Sie sollten yytext überhaupt nicht in Grammatikregeln verwenden. Es wird nicht immer den Wert haben, von dem Sie denken, dass er es haben könnte. Sie sollten es in der yyunion im Scanner speichern:

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

und in ähnlicher Weise für die anderen Regeln, die es brauchen, und es dann so in den Parser verwenden:

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

die üblichen Techniken für die YYUNION deklarieren und die Knoten eingeben.

+0

ich mache diese Änderungen und jetzt habe ich neuen Fehler: In Funktion 'yylex': Anfrage für Mitglied 'Text' in etwas nicht eine Struktur oder Union. –

+0

ich benutze es so: [0-9] + {yylval = strdup (yytext); NUM zurückgeben; } und es funktionierte thnks. –

+0

Also müssen Sie 'text' als Mitglied der Union deklarieren, wie ich oben sagte. Sie müssen herausfinden, wie Sie die yyunion verwenden und wie Sie Ihre Parse-Baumknoten stark eintippen. Es wird dir auf lange Sicht helfen. – EJP