#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» пусты