Сделать грамматику LL

Я уже потратил много времени на его преобразование, но я всегда встаю, получая общий префикс ID.

Кто-нибудь может мне это объяснить? поскольку я пытаюсь сделать это для очень большой грамматики и нуждаюсь в моих основах ясно.

A, B, C, D являются единственными нетерминалами.

A : ‘(‘ B ‘)’ 
 | ID ASSIGN C 
 | C 

C : C '+' D 
 | C '-' D 
 | D 

D : ID 
 | ID '(' actuals ')' 
 | ID '(' ')' 
 | INT_LIT 
 | ‘(‘ C ‘)’ 


B : B ';' A | A

1 ответ

В LL у производства не может быть нескольких опций, начинающихся с одного терминала, поэтому, если хотите, вы тянете эти общие части в общую головку. Так

D : ID 
 | ID '(' actuals ')' 
 | ID '(' ')' 
 | INT_LIT 
 | ‘(‘ C ‘)’ 

становится чем-то вроде

D : D_things_that_start_with_ID
 | D_things_that_do_not_start_with_ID

где

D_things_that_start_with_ID :
  ID D_things_that_follow_ID

D_things_that_follow_ID :
  epsilon
  | '(' actuals ')' 
  | '(' ')' 

D_things_that_do_not_start_with_ID :
 INT_LIT 
 | ‘(‘ C ‘)’ 

и так далее для других общих ведущих символов.

Другие вопросы по тегам