2017-11-29 29 views
0

"boolean x;"という式をチェックしようとしていますが、私は "構文エラー"を取得していると私はなぜ理解できません。 "x = 3;"という式をチェックしているときに、または "2 = 1;"の場合、抽象構文ツリーが生成され、エラーは表示されません。YaccとLex "構文エラー"

%% 
[\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のファイル:

%{ 
#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

スペル:それは "bool"か "boolean"ですか? –

+0

ああ申し訳ありません。私は式 "boolean x;"をチェックしようとしています。 – SophieVi

+0

この読みにくい混乱をフォーマットしてください。 – EJP

答えて

0

最初に

レックス・ファイル(私はこのプロジェクトにLexとYaccの横に何かを使用することはできないと私はUbuntuのを使用しています)構文エラーをデバッグするステップは、bisonファイル内の%error-verboseを有効にすることです。 「構文エラー」というだけでなく、booleanキーワードの後に​​予期せぬ文字があることがわかったとき、それは識別子を予期していました。

したがって、予期しない文字がどこで生成されるのかを確認できるように、一致する文字を印刷するレクサーの.ルールにprintステートメントを追加しましょう。今はスペースを表示していますが、スペースは無視されているはずです。それでは、それを行うことになっていますルールを見てみましょう:

[\n\t ]+; 

エディタは、Flexファイルの強調表示適切な構文を持っている場合は、問題が今明らかになるはずです:;はルールではなく、アクションの一部として見られています。つまり、ルールは、空白と一致するだけでなく、空白と一致し、その後にセミコロンが続きます。

セミコロンを削除しても問題ありません。

+0

ありがとうございました。しかし、それは仕事をしなかった。私はセミコロンを削除して、同じ構文エラーが発生しました。 %error-verboseを追加しようとしたときに、 "yacc project1.y"と入力したときに "project1.y"のyacc:e-line 14、構文エラー%error-verbose " – SophieVi

+0

すべてに対してprintfを作成しようとしましたlexファイル内のトークン。 "x = 3"の場合、id = numと表示されます。と "ブールxの;"構文エラーboolが出力されました。 – SophieVi

関連する問題