Bison을 사용하여 C++에서 파서를 생성하려고합니다. 문법은 괜찮지 만, 나는 그 행동에 약간의 문제가있다. 다음은 간단한 샘플입니다.Bison의 작업 순서
statements
: statement
| statements statement;
제가 아는 한, 이것은 매우 일반적인 일입니다. 내가 가진 질문은 먼저 파생 된 것입니다. 예를 들어, 나는 들소가
statement (statement (statement (statement))))
또는
(((statement) statement) statement) statement
나는의 연결리스트를 구축하기 위해 노력하고있어 나의 행동을 호출 않습니다
statement statement statement statement
처럼 보이는 입력이있는 경우 여기에서 규칙이 호출되며 입력 한 순서와 동일한 순서로 목록을 유지하려고합니다. OK, 그래서이 뭔가를 할 수 있습니다 : 바로 지금, 나는
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;
왜 downvote? – Praetorian
@DeadMG :'$ 2'를'$ 1'에 추가하고'$$'을 통해'$ 1'을 "return"하기 때문에 다음 파생 이후 같은 노드의'Next' 포인터를 * 리셋 할 것입니다. 링크 된리스트를 필사적으로 원한다면 (왜 '벡터'또는 'deque'가 아닌가?), 머리와 꼬리 모두에 대한 포인터를 유지해야한다. –
@larsmans : 내가 의존 할 수있는 곳을 저장하지 않았기 때문에 저는 벡터 또는 양면 기준을 사용하지 않습니다. 스택 (C 스타일 문법)에 여러 개의 'statement'가있을 수 있으며 Bison은 복잡한 컨테이너를 지키지 않습니다. 사실, 생각해 보니, 실제로 스택이 될 것이라고 결코 짐작하지 않았습니다. 그래서 나는 사용자 정의 인수에이를 저장할 수 있었고, 중간 규칙 인수를 사용하여 밀어 넣고 팝했습니다. – Puppy