gpt4 book ai didi

bison - flex/bison 中的半保留字处理

转载 作者:行者123 更新时间:2023-12-01 11:41:45 26 4
gpt4 key购买 nike

考虑这个 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; }
[ \t\n\r] /* skip whitespace */
. { printf("Unknown character [%c]\n",yytext[0]);
return UNKNOWN; }
%%

int yywrap(void){return 1;}

在这个例子中标识符不能是保留字,因为它会在上面匹配。
在这种情况下,是否有某种技术允许将标识符定义为保留字?

最佳答案

我认为您正在寻找的是解析器告诉词法分析器在给定上下文中保留哪些词的一种方式。但是,这并不容易,特别是因为解析器经常在任何操作发生之前读取前瞻标记。

一个更简单的解决方案是设置 yylval适用于任何半保留字,然后在您的解析器中使用这样的产品:

id_or_procedure: IDENTIFIER | PROCSYM;

id_or_conditional: IDENTIFIER | THENSYM | ODDSYM;

这不容易维护,因为它需要您弄清楚哪些半保留词适用于哪些上下文。但是如果你只有几个半保留词,而且它们只保留在一些非常特定的上下文中,那么它是非常可行的。

关于bison - flex/bison 中的半保留字处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com