0
나는 if, whileblock 문을 구현할 때 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 문제) 또는 완전히 뚫을 수없는 문법입니다.

답변

2

문제는 문법이 지정 있다는 것을 세미콜론이 block_stmt의 while_stmt의 세미콜론 또는 중 하나를 해석 할 수있다 예를 들면 ... 아니 죄송합니다 그래서 그게 아니라면 RHS에 {stmt}가 두 번 나타나기 때문에 문법이 중복됩니다. 일반적으로 할 것입니다.

stmts ::= stmt | stmts stmt 
block_stmt ::= { stmts } 
stmt ::= ... | block_stmt | ;  // empty 
while_stmt ::= while ... stmt