Моя грамматика не LL (1)? Где это неверно?

#parsing #grammar #ll

#синтаксический анализ #грамматика #ll

Вопрос:

Я попытался применить свои правила к https://www.cs.princeton.edu/courses/archive/spring20/cos320/LL1 / но он не может разобрать строку

 for name := num to num do begin operator ; end ;

S ::= for NAME := NUM1 T NUM2 do LIST C
NAME ::= name
NUM1 ::= num T
T ::= to NUM2
NUM2 ::= num
LIST ::= begin O
O ::= operator C D
C ::= ;
D ::= O
D ::= end C
 

Ответ №1:

Грамматика LL (1), но этот инструмент, похоже, используется S внутри для правила start, и у вас уже есть это в вашей грамматике. Если вы переименуете его в ‘X’ (например), он, похоже, распознается. Также вы, вероятно, не хотите NUM1 ::= num T , чтобы as T уже было доступно после NUM1 в правиле S , которое следует переименовать. Вы также можете не захотеть T ::= to NUM2 иметь NUM2 as NUM2 уже в S after T .

Основываясь на вашем комментарии, я обновлю ответ. Как я уже писал, грамматика, вероятно, не то, что вы хотите, вот измененная грамматика:

 ST ::= for NAME := NUM1 T NUM2 do LIST
NAME ::= name
NUM1 ::= num
T ::= to
NUM2 ::= num
LIST ::= begin O
O ::= operator C D
C ::= ;
D ::= O
D ::= end C
 

Я удалил T from NUM1 и NUM2 from T , потому что они уже ожидаются ST . Я также удалил C из конца ST , потому LIST что O в конце C D есть то, что уже есть. Первоначальный вопрос был о грамматике LL (1), и «да» это так. Но распознает ли грамматика то, что вы ожидаете, — это другой вопрос.

Если, однако, вам нужна именно ваша оригинальная грамматика, тогда этот ввод будет принят:

 for name := num to num to num num do begin operator ; end ; ;
 

Комментарии:

1. да, я уже переименовываю S в ST, но там написано: недопустимый переход от нетерминального «T» будет выглядеть как символ «do». и столбцы в таблице для «: =» и «do» пусты