I m试图在C++中利用Bison生成一个 par子。 图表是细微的,但我对这些行动有一些迅速的麻烦。 这里有一个简单的样本:
statements
: statement
| statements statement;
我知道,这是很正常的事情。 我提出的问题首先产生。 例如,如果我有这样的投入,那么我会这样做。
statement statement statement statement
Bison称我的行动
statement (statement (statement (statement))))
或
(((statement) statement) statement) statement
I m trying to construct a linked list of the rules invoked here, and I want to keep the list in the same 或der as was input. Right now, I ve got
statements
: statement
{
$$ = $1;
}
| statements statement
{
dynamic_cast<ParsedFile::Statement*>($1)->Next = dynamic_cast<ParsedFile::Statement*>($2);
$$ = $1;
};
Edit: OK,因此我可以做这样的事情:
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;