Сделать грамматику 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 ‘)’
и так далее для других общих ведущих символов.