Проблема в том, что существует ряд способов, которыми matched
может расшириться до чего-то, что заканчивается statement
(и, следовательно, unmatched
). В частности, While_statement
, for_statement
и with_statement
все заканчиваются на statement
без какого-либо терминатора. Так что statement
может быть unmatched
(если) и, таким образом, если оно появляется после THEN
, это вызывает неоднозначность. Например:
IF expression THEN WHILE expression DO IF expression THEN statement ELSE statement
является неоднозначным, поскольку ELSE
может связываться с IF
. Чтобы это исправить, нужно разделить
все операторы, которые могут заканчиваться оператором в matched
и unmatched
версиях. Так что в итоге вы получите
statement : matched
| unmatched
;
matched: assignment
| matched_if_statement
| case_statement
| matched_while_statement
| matched_for_statement
| matched_with_statement
| subprogram_call
| io_statement
| comp_statement
|
;
unmatched: unmatched_if_statement
| unmatched_while_statement
| unmatched_for_statement
| unmatched_with_statement
;
matched_while_statement : WHILE expression DO matched
;
unmatched_while_statement : WHILE expression DO unmatched
;
и т.д. * * тысяча двадцать-одна
Все правила unmatched
расширяются до некоторого сложного оператора, который заканчивается непревзойденным, если нет соответствующего else, который не может появляться между THEN и ELSE.