gpt4 book ai didi

c - 如何在 Lex 和 Yacc 中获取整个输入字符串?

转载 作者:行者123 更新时间:2023-11-30 14:31:25 24 4
gpt4 key购买 nike

好的,这就是交易。

用我的语言,我有一些命令,比如

XYZ 3 5
GGB 8 9
HDH 8783 33

在我的 Lex 文件中

XYZ { return XYZ; }
GGB { return GGB; }
HDH { return HDH; }
[0-9]+ { yylval.ival = atoi(yytext); return NUMBER; }
\n { return EOL; }

在我的 yacc 文件中

start : commands
;

commands : command
| command EOL commands
;

command : xyz
| ggb
| hdh
;

xyz : XYZ NUMBER NUMBER { /* Do something with the numbers */ }
;

etc. etc. etc. etc.

我的问题是,如何获取整个文本

XYZ 3 5
GGB 8 9
HDH 8783 33

在仍然返回数字的情况下执行命令?

另外,当我的 Lex 返回一个 STRING [0-9a-zA-Z]+ 时,我想验证它的长度,我应该这样做吗

rule: STRING STRING { if (strlen($1) < 5 ) /* Do some shit else error */ }

或者实际上我的 Lex 中有一个根据长度返回不同标记的标记?

最佳答案

如果我正确理解了你的第一个问题,你可以有像这样的语义 Action

{ $$ = makeXYZ($2, $3); }

这将允许您根据需要构建命令的值。

对于你的第二个问题,词法分析和语法分析之间以及语法分析和语义分析之间的界限并不严格且固定。移动它们是在描述的容易性、错误消息的清晰度和出现错误时的鲁棒性等因素之间进行权衡。考虑到字符串长度的验证,出现错误的可能性相当大,如果通过不同长度返回不同终端来处理,错误信息可能会不清楚。因此,如果可能的话——这取决于语法——我会在语义分析阶段处理它,在这个阶段可以轻松地定制消息。

关于c - 如何在 Lex 和 Yacc 中获取整个输入字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1236263/

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