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