2016-12-19 3 views
0

J'essaie de créer un compilateur de base et je suis confronté à des problèmes.En-tête y.tab.h introuvable lors de la compilation de lex.yy.c

Mon code flex:

%{ 
    #include <stdio.h> 
    #include "SymbolTable.h" 
    #include <y.tab.h> 

    //extern "C" 
    //{ 
    // extern int yylex(void); 
    // extern int yyparse(void); 
    //} 

    int line_count = 1; 
    SymbolTable table; 
    static int yywrap(void); 

    void insert(const char* token, char* yytext) { 
    ////printf ("%s: %s ", token, yytext); 
    //printf ("%s ", token); 
    SymbolInfo symbolInfo(yytext, token); 
    table.insert(symbolInfo, line_count); 
    } 
    %} 

    newLine   \n 
    delim   [ \t] 
    digit   [0-9] 
    unsigned  {digit}+ 
    exponent  [eE][+-]?{unsigned} 
    number   [-+]?({unsigned}|{unsigned}\.{unsigned}?|{unsigned}?\.{unsigned}){exponent}? 
    letter   [A-Za-z] 
    keyword   program|if|not|end|begin|else|then|do|while|function|Procedure|integer|real|var|oh|array|write|include 
    id    (_|{letter})({letter}|{digit}|_)* 
    header   {id}\.h 
    sin_comment  \/\/.* 
    mul_comment  "/*"(([^*]|(("*"+)[^*/]))*)("*"+)"/" 
    string   \"(\\.|[^"])*\" 
    char   \'(\\.|[^'])*\' 
    addop   [\+-]|or 
    mulop   [\*\/]|div|mod|and 
    orop   || 
    leop   <= 
    geop   >= 
    eqop   == 
    neop   != 
    assignop  := 
    dotdot   \.\. 
    brace   [\[\]\(\)] 
    other   [,;:] 
    hash   # 
    err_dotdot  [0-9]+\.([0-9]+\.){1,} 
    err_id   {digit}+{id} 
    leftcurl  { 
    rightcurl  } 



    %% 
    {newLine} { 
    line_count++; 
    } 

    {string} { 
    //printf ("str: %s\n", yytext); 
    //printf ("line no: %d\n",line_count); 
    //fprintf(tokenout,"\n<STRING, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: STRING <%s> found\n",line_count,yytext); 
    } 

    {char} { 
    //printf ("str: %s\n", yytext); 
    //printf ("line no: %d\n",line_count); 
    //fprintf(tokenout,"\n<CHAR, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: CHAR <%s> found\n",line_count,yytext); 
    } 

    {keyword} { 

    ////printf ("keyword"); 
    //fprintf(tokenout,"\n<KEYWORD, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: KEYWORD <%s> found\n",line_count,yytext); 

    } 

    {header} { 
    insert("header",yytext); 
    //fprintf(tokenout,"\n<HEADER %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: HEADER <%s> found\n",line_count,yytext); 

    } 

    {id} { 
    SymbolInfo symbolInfo(yytext, "ID"); 
    table.insert(symbolInfo, line_count); 
    //printf ("id: %s\n", yytext); 
    //fprintf(tokenout,"<ID, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: ID <%s> found\n",line_count,yytext); 
    } 

    {sin_comment} { 
    //printf ("\nSingleline comment found: %s\n",yytext); 
    //fprintf(logout,"\nLine no %d: SINGLELINECOMMENTP <%s> found\n",line_count,yytext); 
    } 

    {mul_comment} { 
    //printf ("\nMultiline comment found: %s\n",yytext); 
    //fprintf(logout,"\nLine no %d: MULTILINECOMMENT <%s> found\n",line_count,yytext); 
    } 

    {number} { 
    //printf ("number:%s\n",yytext); 
    //printf ("line no: %d\n",line_count); 
    SymbolInfo symbolInfo(yytext, "NUMBER"); 
    table.insert(symbolInfo, line_count); 
    //fprintf(tokenout,"<NUMBER, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: NUMBER <%s> found\n",line_count,yytext); 
    return NUMBER; 

    } 

    {addop} { 
    insert("ADDOP", yytext); 
    //printf ("line no: %d\n",line_count); 
    //fprintf(tokenout,"\n<ADDOP, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: ADDOP <%s> found\n",line_count,yytext); 
    return ADDOP; 
    } 

    {mulop} { 
    insert("MULOP", yytext); 
    //printf ("line no: %d\n",line_count); 
    //fprintf(tokenout,"\n<MULOP, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: MULOP <%s> found\n",line_count,yytext); 
    } 

    {assignop} { 
    insert("ASSIGNOP", yytext); 
    //printf ("line no: %d\n",line_count); 
    //fprintf(tokenout,"\n<ASSIGNOP, %s>\n",yytext); 
    //fprintf(logout,"\nLine no %d: ASSIGNOP <%s> found\n",line_count,yytext); 
    } 


    {dotdot} { 
    insert("DOTDOT", yytext); 
    //printf ("line no: %d\n",line_count); 
    } 
    {hash} { 
    insert("#",yytext); 
    } 

    {delim}+ {} 

    {err_dotdot} { 
    //printf ("Illegal usage of decimal\n"); 
    //fprintf(logout,"\nLine no %d: Illegal usage of decimal <%s> found\n",line_count,yytext); 
    } 

    {err_id} { 
    //printf ("Illegal id\n"); 
    //fprintf(logout,"\nLine no %d: Illegal usage of id <%s> found\n",line_count,yytext); 
    } 

    %% 

Je peux heureusement créer lex.yy.c par lex -o lex.yy.c lex.l.

Mais lorsque je tente de créer un fichier d'objets en utilisant lex g++ -c -w -o lexer.o lex.yy.c il dit

lex.l:4:19: fatal error: y.tab.h: No such file or directory 

Je l'ai déjà analysé l'analyseur en utilisant bison -d -y grammar.y

+0

Le fichier y.tab.h se trouve-t-il dans votre répertoire actuel? – ojblass

+0

Étant donné que 'y.tab.h' est fourni par * vous *, pas par le système, il serait conventionnel d'utiliser la forme include citée:' #include "y.tab.h" '. Il est possible que cela résout même le problème. –

+0

Oui c'est. Créé en utilisant bison -d -y grammer.y. – desertSniper87

Répondre

0

Modification « y.tab.h » dans votre code. En outre, vous pouvez inclure un paramètre à gcc pour inclure le chemin d'accès au fichier

g++ -c -w -I /path/to/header -o lexer.o lex.yy.c 
+0

La nature de la distinction entre les deux formes de directives '# include 'dépend de l'implémentation. En fonction de la mise en œuvre, il peut ne pas y avoir de différence entre les deux formes, il est donc un peu spéculatif de lui attribuer une quelconque importance. –

+0

Passer à "y.tab.h" résout cela. Oh mec, j'ai perdu 1 jour de plus. Flex est une langue étrange. Je t'en dois une. – desertSniper87

+0

@ desertsniper87: C'est C, pas flex. C'est généralement une bonne idée de savoir comment écrire un prigramme en C avant de commencer à utiliser fkex/bison. – rici