gpt4 book ai didi

c - 使用 Flex(lex) 和 Bison(yacc) 进行错误处理

转载 作者:行者123 更新时间:2023-12-02 09:00:44 25 4
gpt4 key购买 nike

来自 Bison 手册:

In a simple interactive command parser where each input is one line, it may be sufficient to allow yyparse to return 1 on error and have the caller ignore the rest of the input line when that happens (and then call yyparse again).

这正是我想要的,但我在上类时遇到了麻烦。基本上,我想检测 flex 中的错误,如果检测到错误,让 Bison 丢弃整行。我现在所拥有的工作不太正常,因为我的命令仍然被执行:

kbsh: ls '/home
Error: Unterminated Single Quote
admin kbrandt tempuser
syntax error
kbsh:

在我的 Bison 文件中:

commands:
/*Empty*/ { prompt(); } |
command { prompt(); }
;

command:
error {return 1; } |
chdir_command |
pwd_command |
exit_command |
WORD arg_list {
execute_command($1, $2);
//printf("%s, %s\n", $1, $2);
} |
WORD { execute_command($1, NULL); }
;

在我的 Flex 中:

'   {BEGIN inQuote; }

<inQuote>\n {printf("Error: Unterminated Single Quote\n"); BEGIN(0); return(ERROR);}

最佳答案

我认为您不会找到一个简单的解决方案来处理词法分析器中的这些类型的解析错误。

我会让词法分析器(flex/lex)尽可能保持愚蠢,它应该只提供基本标记流(标识符、关键字等...)并让解析器(yacc/bison)进行错误检测。事实上,它的设置正是您想要的,只需对您的方法进行一些调整...

在词法分析器(parser.l)中,保持简单(没有 eol/换行符处理),例如(不是完整的东西):

}%

/* I don't recall if the backslashify is required below */
SINGLE_QUOTE_STRING \'.*\'
DOUBLE_QUOTE_STRING \".*\"

%%
{SINGLE_QUOTE_STRING} {
yylval.charstr = copy_to_tmp_buffer(yytext); // implies a %union
return STRING;
}
{DOUBLE_QUOTE_STRING} {
yylval.charstr = copy_to_tmp_buffer(yytext); // implies a %union
return STRING;
}
\n return NEWLINE;

然后在你的 parser.y 文件中进行所有真正的处理(不是完整的事情):

command:
error NEWLINE
{ yyclearin; yyerrorok; print_the_next_command_prompt(); }
| chdir_command STRING NEWLINE
{ do_the_chdir($<charstr>2); print_the_next_command_prompt(); }
| ... and so on ...

这里有两点需要注意:

  1. 将诸如 NEWLINE 之类的内容转移到 yacc 端,以便您可以确定用户何时完成命令,然后您可以清除内容并重新开始(假设您在某处有“int yywrap() {return 1;} ”)。如果您尝试在 Flex 中过早检测到它,您什么​​时候知道引发错误?
  2. chdir 不是一个命令(除非它被子规则并且您只是没有显示它),它现在有 chdir_command STRING (chdir 的参数)。这使得解析器可以找出出了什么问题,然后如果该目录不存在,您可以 yyerror 等等...

这样你应该得到类似的东西(猜测 chdir 可能是什么样子):

cd 'some_directory
syntax error
cd 'some_directory'
you are in the some_directory dude!

这一切都是由 yacc 语法器处理的,而不是由分词器处理的。

我发现保持弹性尽可能简单可以给你最大的灵活性。 :)

关于c - 使用 Flex(lex) 和 Bison(yacc) 进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1433245/

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