이 스택 오버플로 질문에 대한 답변을 찾고 있습니다. 누군가이 질문 이 나에게 물어 보려는 것을 안내해 줄 수 있습니까?
응답 한 사람이 설명하는대로 다음을 수행하도록 요청합니다.
두 개의 함수를 작성하십시오.
ifblock logic_expr
선택한 언어로 된 재귀 하강 파서의 일부로.
<ifblock> --> if(<logic_expr>){<stmts>} [else {<stmts>}] <logic_expr> --> <value> == <value> | <value> != <value>
다른 비 터미널 기호, 'stmts'및 'value'의 경우 동일한 이름으로 미리 작성된 함수의 존재를 가정 할 수 있습니다.
입력 스트림에서 다음 토큰을 얻으려면 터미널 기호에 대한 코드에 나열된대로 코드를 반환하는 'lex ()'를 호출 할 수 있습니다. 'lex ()'를 호출하여 토큰 코드를 요청하여 'ifblock'을 구현하고 언어 문법에 따라 필요한 토큰을 평가하고 일치시킵니다.
'if'의 논리식을 평가하려면 문법에 정의 된 논리식을 평가하기 위해 작성해야하는 'logic_expr'함수를 입력해야하며 비 말단 '값'이 있다고 가정 할 수 있습니다. 이미 존재합니다.
대답은 다음과 같을 수 있습니다. 물론 이것은 문법 파서의 잘린 의사 코드 일 뿐이며 오류 처리 방식이나 AST 빌더가 많지 않습니다.
void parse() {
while (!EOF)
if (lex() == IF)
ifblock()
else // what is it?
}
void ifblock () {
if (lex() != LP)
return_error;
le = logic_expr();
if (lex() != RP)
return_error;
// parse statements in {}, optional else (if (lex() == ELSE) with {}
// if no errors
create_if_node(le, st, ...);
}
void logic_expr()
v1 = value();
op = lex();
v2 = value();
if (op == EQ)
return create_eq_node(v1, v2);
else if (op == NEQ)
return create_neq_node(v1, v2);
return_error();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다