/ / semi-vyhradené slová manipulácia vo flex / bison - bizón, yacc, lex, flex-lexer, lexikálna analýza

semiservačné slová v flex / bison - bizón, yacc, lex, flex-lexer, lexikálna analýza

Zvážte tento súbor lex.l:

%{
#include "y.tab.h"
%}

digit         [0-9]
letter        [a-zA-Z]

%%
"+"                  { return PLUS;       }
"-"                  { return MINUS;      }
"*"                  { return TIMES;      }
"/"                  { return SLASH;      }
"("                  { return LPAREN;     }
")"                  { return RPAREN;     }
";"                  { return SEMICOLON;  }
","                  { return COMMA;      }
"."                  { return PERIOD;     }
":="                 { return BECOMES;    }
"="                  { return EQL;        }
"<>"                 { return NEQ;        }
"<"                  { return LSS;        }
">"                  { return GTR;        }
"<="                 { return LEQ;        }
">="                 { return GEQ;        }
"begin"              { return BEGINSYM;   }
"call"               { return CALLSYM;    }
"const"              { return CONSTSYM;   }
"do"                 { return DOSYM;      }
"end"                { return ENDSYM;     }
"if"                 { return IFSYM;      }
"odd"                { return ODDSYM;     }
"procedure"          { return PROCSYM;    }
"then"               { return THENSYM;    }
"var"                { return VARSYM;     }
"while"              { return WHILESYM;   }
{letter}({letter}|{digit})* {
yylval.id = strdup(yytext);
return IDENT;      }
{digit}+             { yylval.num = atoi(yytext);
return NUMBER;     }
[ tnr]            /* skip whitespace */
.                    { printf("Unknown character [%c]n",yytext[0]);
return UNKNOWN;    }
%%

int yywrap(void){return 1;}

V tomto príklade identifikátor nemôže byť vyhradené slovo, pretože bude spárovaný vyššie. Je to v tomto prípade nejaká technika, ktorá umožňuje definovať identifikátor ako rezervované slovo?

odpovede:

5 pre odpoveď č. 1

Myslím, že to, čo hľadáte, je cesta preanalyzátor, aby lexeru povedal, ktoré slová sú vyhradené v danom kontexte. To však nie je jednoduché, najmä preto, že syntaktický analyzátor často prečíta tok tokenov pred vykonaním akejkoľvek akcie.

Jednoduchšie je nastavenie yylval primerane pre všetky polo-vyhradené slovo, a potom použite vo svojich syntaktických analyzátoroch podobné produkcie:

id_or_procedure: IDENTIFIER | PROCSYM;

id_or_conditional: IDENTIFIER | THENSYM | ODDSYM;

To nie je ľahké udržať, pretože to vyžadujezistíte, ktoré semi-vyhradené slová sú použiteľné v ktorých kontextoch. Ale ak máte len niekoľko polo-vyhradených slov a sú vyhradené len v niektorých veľmi špecifických kontextoch, potom je to celkom funkčné.