나는 재귀 하강 파서를 구축하고 나는 목록을 작성 두 가지 규칙을 가지고에 의존 루프가있는 단일 규칙을 쉽게 이해할 수 있지만 컴파일러가이를 확인할 수있는 꼬리 호출 최적화를 수행 할 수 있다는 것을 알고 있습니다.하향식 재귀 하강 구문 분석 : 지금은 당신이에이 두 가지 규칙을 최적화 할 수 있다는 사실을 알고</p> <pre><code>ValueList -> TOKEN_IDENTIFER TOKEN_QUOTE ValueListP ValueListP -> ValueList | %EPSILON% </code></pre> <p>: 꼬리 호출 최적화
1)합니까 내 제공된 코드를 활용 꼬리 호출 최적화 :
void Parser::grammarValueList(std::deque<std::unique_ptr<ValueNode>>& arg1)
{
std::string var1 = m_currentToken.getValue().string;
if(acceptToken(Token::Type::TOKEN_IDENTIFIER))
{
std::string var2 = m_currentToken.getValue().string;
if(acceptToken(Token::Type::TOKEN_QUOTE))
{
arg1.push_back(std::unique_ptr<ValueNode>(new ValueNode(var1, var2)));
if(peekValueListP())
{
return grammarValueListP(arg1);
}
}
}
throw ParseException("Error: did not expect \"" + m_currentToken.toString() + "\"");
}
void Parser::grammarValueListP(std::deque<std::unique_ptr<ValueNode>>& arg1)
{
if(peekValueList())
{
return grammarValueList(arg1);
}
else
{
return;
}
throw ParseException("Error: did not expect \"" + m_currentToken.toString() + "\"");
}
그래서 나는 두 가지 질문이있다 : 여기에 내 현재 코드는?
2) 코드 조각이 꼬리 호출 최적화를 활용하더라도 프로그래머는 사소한 경우 프로그래머가 자체 최적화 (반복을 제거하고 루프로 대체)를 시도해야합니까?
특정 컴파일러가 테일 호출 최적화를 수행하는지 확인하려면 방출 된 어셈블리 언어 코드를 확인하십시오. –
컴파일러가 컴파일러가 될 수 있다는 것을 의미하지는 않습니다. C++ 표준은 컴파일러가 관찰 할 수없는 최적화를 구현할 수 있도록합니다. 컴파일러는 그렇게 할 필요가 없습니다. –
간단한 해결책은 재귀 대신 반복을 사용하는 것입니다. – EJP