if
,
while
및
block
문을 구현할 때
shift-reduce
/
reduce-reduce
문제로 지속적으로 실행되지만 sablecc에 간단한 Java 파서를 구현하려고합니다.
shift-reduce/reduce-reduce 자유 문법 생성하기
예를 들어, 나는 다음을 고려했다 :
stmts
= stmt*
;
stmt
= if_stmt
| block_stmt
| while_stmt
;
block_stmt
= { stmts }
| ;
;
while_stmt
= while
(
predicate
)
{
stmts
}
| while
(
)
)
;
예를 들어,
while (true) ;
형식의 항목이있을 때 구문 분석기는 ;
을 줄이는 지 알 수 없습니다 block_stmt
) 또는 전체 while (true);
(while_stmt
).
나는 어디에서나 shift-reduce
/reduce-reduce
문제에 대한 이유를 읽었으며 이해하고 있다고 생각합니다. 그러나 무엇이 그들을 일으키는지를 아는 것이고, 완전히 다른 것은 문법을 구조화하는 방법을 알고 있으므로 그것을 피할 수 있습니다. 나는 매우 다른 방식으로 문법을 구현하려고 시도했지만 그럼에도 불구하고 결국 문제가 발생합니다.
특정 ss
/rr
문제에서 실행하려고 시도하는 대신 이런 종류의 문제를 피하기 위해 일종의 패러다임이 있어야한다고 생각하십니까? 나는 문제에 접근하는 내 방식이 완전히 틀림 없어야한다고 믿는다 : (
)이 모든 함정에 빠지지 않고 문법을 처음부터 구축하는 방법에 관한 자원은 무엇이든지? 명백한 if then else
문제) 또는 완전히 뚫을 수없는 문법입니다.