Это LL (1) парсер ломается из-за совершенно неправильного следования? - PullRequest
0 голосов
/ 25 марта 2020

Это грамматика:

<program> ::= { <statement_list> }
<statement_list> ::= <statement> <statement_list’>
<statement_list’> ::= ; <statement_list’’>
<statement_list’’> ::= <statement_list> | ϵ
<statement> ::= call : <procedure_call> | compute : <expression>
<procedure_call> ::= id ( <parameters> )
<parameters> ::= <factor> <parameters’>
<parameters’> ::= , <parameters> | ϵ
<expression> ::= id = <factor><expression’>
<expression’> ::= + <factor> | - <factor> | ϵ
<factor> ::= id | num

Сначала я вычислил следующее неверно, это вычисленные значения по эпсилонам:

FOLLOW(<statement_list’’>) = FOLLOW(<statement_list’>) = FOLLOW(<statement_list>) ={$}
FOLLOW(<parameters’>) = FOLLOW(<parameters>) = {(}
FOLLOW(<expression’>) = FOLLOW(<expression>) = {$}
EDIT: I now see my follows are wrong.
FOLLOW(<statement_list’’>) = FOLLOW(<statement_list’>) = FOLLOW(<statement_list>) ={}}
FOLLOW(<parameters’>) = FOLLOW(<parameters>) = {)}
FOLLOW(<expression’>) = FOLLOW(<expression>) = {}}

Это выводимый лог-результат:

{
compute
:
id
=
num
;
ERROR
ERROR

Он обрабатывает точку с запятой как ошибку, которую я считаю. Исходный текст представляет собой текстовый файл, идентичный первым 7 токенам, следующие 6 просто "compute: id = num;".

...