gpt4 book ai didi

c++ - Bison 中的 Action 顺序

转载 作者:行者123 更新时间:2023-11-30 02:08:27 27 4
gpt4 key购买 nike

我正在尝试使用 Bison 在 C++ 中生成解析器。语法很好,但我在操作时遇到了一些快速问题。这是一个简单的示例:

statements
: statement
| statements statement;

据我所知,这是一件很正常的事情。我的问题是哪个先导出。例如,如果我有一个看起来像的输入

statement statement statement statement

Bison 是否称我的行为为

statement (statement (statement (statement))))

(((statement) statement) statement) statement

我正在尝试构建此处调用的规则的链接列表,并且我希望该列表的顺序与输入的顺序相同。现在,我有

statements
: statement
{
$$ = $1;
}
| statements statement
{
dynamic_cast<ParsedFile::Statement*>($1)->Next = dynamic_cast<ParsedFile::Statement*>($2);
$$ = $1;
};

编辑:好的,所以我可以做这样的事情:

switch_statement
: SWITCH '(' expression ')'
{
auto Switch = p.Make<ParsedFile::SwitchStatement>();
Switch->Test = dynamic_cast<ParsedFile::Expression*>($3);
p.NewScope();
$$ = Switch;
}
'{' case_statements '}'
{
auto Switch = dynamic_cast<ParsedFile::SwitchStatement*>($5);
Switch->Cases = p.statements.top();
p.PopScope();
p.AddToCurrentScope(Switch);
};

default_statement
: DEFAULT ':'
{
auto Default = p.Make<ParsedFile::DefaultStatement>();
p.NewScope();
$$ = Default;
}
statements
{
auto Default = dynamic_cast<ParsedFile::DefaultStatement*>($3);
Default->Statements = p.statements.top();
p.PopScope();
p.AddToCurrentScope(Default);
};

case_statement
: CASE expression
{
auto case = p.Make<ParsedFile::CaseStatement>();
p->Value = dynamic_cast<ParsedFile::Expression*>($2);
p.NewScope();
$$ = case;
}
DOUBLE_COLON statements
{
auto Case = dynamic_cast<ParsedFile::CaseStatement*>($3);
Case->Statements = p.statements.top();
p.PopScope();
p.AddToCurrentScope(Case);
};

case_statements
: case_statement
| case_statements case_statement
| case_statements default_statement;

最佳答案

它关联到左边,即

(((statement) statement) statement) statement

您可以说这是唯一的可能性,因为这可以简化为 statements statement,这是您的作品之一。另一种选择

statement (statement (statement (statement))))

必须减少为statement statements不是您的作品之一。但是,如果您想要右结合性,则可以使用它。

您的代码不会按原样生成链表,因为在将一个语句与另一个语句连接后,您将返回指向第一个 语句的指针,因此当下一个语句出现时,您覆盖第一个语句的 Next 指针。

将顺序更改为右关联应该可以解决这个问题,但请注意,这将需要线性解析器堆栈空间的语句数。如果您期望有很多语句,那么您应该考虑反向构建链表。

关于c++ - Bison 中的 Action 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6836077/

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