gpt4 book ai didi

c - 在 yacc 中处理 block

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:24 25 4
gpt4 key购买 nike

我正在为以下简单语言构建一个带有 lex + yacc 的解析器:

lines are parsed ok

foo {
lines of the "foo" category come here
} # closing this block

我的语法中 block 的以下定义有效:

item : block
| lines; /* lines without a block */

block: WORD BRACE_OPEN NL lines BRACE_CLOSE
{ printf("category: %s\n", $1 );}

问题是 printf 发生在 block 被解析后,但我需要获取类别名称(示例中的“foo”)作为信息解析 block 中的行。

我想出了一个解决方案,但它看起来不是很优雅:

item : line
| block_open
| block_close;

block_open : WORD BRACE_OPEN { printf("%s {\n", $1); };

block_close : BRACE_CLOSE { printf("}\n"); };

我现在可以在打开 block 时获取“类别”名称。但这是正确的还是最好的方法?

谢谢!

最佳答案

block: WORD BRACE_OPEN NL lines BRACE_CLOSE
{ printf("category: %s\n", $1 );}

你可以在任何地方放置一个 Action (尽管它可能会导致 s/r 冲突):

block
: WORD
{ printf("category: %s\n", $1 );}
BRACE_OPEN NL lines BRACE_CLOSE
;

相当于

block
: category BRACE_OPEN NL lines BRACE_CLOSE
;
category
: WORD
{ printf("category: %s\n", $1 );}
;

你可能更喜欢后者。

关于c - 在 yacc 中处理 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798768/

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