2017-11-29 16 views
0

Wenn ich versuche, den Ausdruck "boolean x;" Ich bekomme "Syntaxfehler" und ich kann nicht verstehen warum. Wenn ich den Ausdruck "x = 3;" oder "2 = 1;", wird der abstrakte Syntaxbaum erzeugt und es werden keine Fehler angezeigt.Yacc und Lex "Syntaxfehler"

%% 
[\n\t ]+; 
boolean {return BOOL;} 
TRUE {return TRUE;} 
FALSE {return FALSE;} 
[0-9]+ {return NUM;} 
[a-zA-Z][0-9a-zA-Z]* {return ID;} 
. {return yytext[0];} 
%% 

Yacc Datei:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct node{ 
    struct node *left; 
    struct node *right; 
    char *token; 
    } node; 
node *mknode(node *left, node *right, char *token); 
void printtree(node *tree); 
#define YYSTYPE struct node * 
%} 
%start code 
%token ID,NUM,TRUE,FALSE,BOOL 
%right '=' 
%% 

code:lines{printtree($1); printf("\n");} 
lines:calcExp';'|assignExp';'|boolExp ';'{$$ = $1;} 
boolExp: boolST id{$$=$2;} 
calcExp: number '+' number {$$ = mknode($1,$3,"+");} 
assignExp: id '=' number{$$ = mknode($1,$3,"=");} 
boolSt : BOOL; 
id : ID {$$ = mknode(0,0,yytext);} 
number : NUM{$$ = mknode(0,0,yytext);} 

%% 
#include "lex.yy.c" 
int main (void) {return yyparse();} 

node *mknode(node *left, node *right, char *token){ 
    node *newnode = (node *)malloc(sizeof(node)); 
    char *newstr = (char *)malloc(strlen(token)+1); 
    strcpy(newstr, token); 
    newnode->left = left; 
    newnode->right = right; 
    newnode->token = newstr; 
    return newnode; 
} 

void printtree(node *tree){ 
    if (tree->left || tree->right) 
     printf("("); 
    printf(" %s ", tree->token); 
    if(tree->left) 
     printtree(tree->left); 
    if(tree->right) 
     printtree(tree->right); 
    if(tree->left || tree->right) 
     printf(")"); 
} 
void yyerror (char *s) { 
    fprintf (stderr, "%s\n",s);} 
+0

Rechtschreibung: ist es "bool" oder "boolean"? –

+0

oh entschuldigung. Ich versuche, den Ausdruck "boolean x;" – SophieVi

+0

Bitte formatieren Sie dieses unlesbare Chaos. – EJP

Antwort

0

Die erste

Lex-Datei (ich bin nicht zu verwenden, etwas neben Lex und Yacc in diesem Projekt und ich bin mit Ubuntu erlaubt) Schritt zum Debuggen von Syntaxfehlern ist das Aktivieren von %error-verbose in der Bison-Datei. Jetzt sagt es nicht nur "Syntaxfehler", sondern sagt uns, dass nach dem Schlüsselwort boolean ein unerwartetes Zeichen vorlag, als es einen Bezeichner erwartete.

Lassen Sie uns also eine print-Anweisung zur . Regel im Lexer hinzufügen, die das übereinstimmende Zeichen ausgibt, damit wir sehen können, wo es unerwartete Zeichen erzeugt. Jetzt sehen wir, dass es ein Leerzeichen druckt, aber Leerzeichen hätten ignoriert werden sollen, oder? Also lassen Sie sich in der Regel suchen, die angenommen haben, das zu tun:

[\n\t ]+; 

Wenn Ihr Editor richtige Syntax hat für Flex-Dateien markiert, sollte das Problem jetzt deutlich werden: Die ; als Teil der Regel zu sehen ist, nicht die Handlung . Das heißt, die Regel stimmt mit Leerzeichen überein, gefolgt von einem Semikolon anstelle von nur weißem Leerzeichen.

Also entfernen Sie das Semikolon und es sollte funktionieren.

+0

Danke für die Antwort. Aber es hat nicht funktioniert. Ich entfernte das Semikolon und ich bekomme den gleichen Syntaxfehler. Als ich versuchte,% error-worse, wenn ich "yacc project1.y" im get "yacc: e-line 14 von" project1.y ", Syntaxfehler% error-worse" – SophieVi

+0

Ich habe versucht, printf für jeden Token in der Lex-Datei. Für "x = 3" hat es id = num gedruckt; und für "boolean x;" es druckte Syntaxfehler bool. – SophieVi