Предположим, мне дали следующую грамматику:
start -> statement //cannot change
statement -> assignment SEMICOLON
statement -> function_call SEMICOLON
assignment -> IDENTIFIER EQUAL expression
function_call -> IDENTIFIER LPAREN parameters RPAREN SEMICOLON
Грамматика прямо сейчас не может быть LL (1), потому что нетерминалы для оператора (назначение и вызов_функции) оба имеют IDENTIFIER в качестве первого терминала для каждого своего производства. Только с помощью 2-х упреждающих действий вы можете решить, по какому пути пойдет синтаксический анализатор.
Есть ли способ манипулировать приведенной выше грамматикой, чтобы она была LL (1)? Или это невозможно?
statement: IDENTIFIER rest; rest: something | something-else
- person rici   schedule 20.10.2016statement -> compound_statement
, но не то, какое из двухcompound_statement
произведений. Поэтому вам нужно использовать левый фактор или выбрать более мощный алгоритм синтаксического анализа, такой как LR (1). - person rici   schedule 21.10.2016