Я изучаю, как работают парсеры, создавая простой рекурсивный анализатор спуска. Однако у меня проблема с определением моей грамматики как LL (1). Я хочу, чтобы иметь возможность проанализировать следующие два утверждения:Проблема, создающая грамматику LL (1)
a = 1
a + 1
Чтобы сделать это, я создал следующие правила грамматики:
statement: assignent | expression
assignment: NAME EQUALS expression
expression: term [(PLUS|MINUS) term]
term: NAME | NUMBER
Однако это приводит к неоднозначности при использовании LL (1), как если токен NAME встречается в правиле statement
, он не знает, является ли он assignment
или expression
без ожидания.
Python грамматика LL (1), поэтому я знаю, что это возможно, но я не могу понять, как это сделать. Я рассмотрел правила грамматики Python, найденные здесь (https://docs.python.org/3/reference/grammar.html), но я все еще не уверен, как они это реализуют.
Любая помощь будет принята с благодарностью :)
LL (1) не означает, что вы не смотрите вперед, это означает, что у вас есть односторонний взгляд вперед (это то, откуда приходит 1). Когда вы найдете токен NAME, ищите следующий токен, это будет токен EQUALS, PLUS или MINUS, тогда вы знаете, какое правило следует следовать на основе этой информации. – Mephy
Исправьте меня, если я ошибаюсь, но я думал, что единственным взглядом на будущее будет токен NAME? – soarjay
Прошло некоторое время с тех пор, как я изучил компиляторы, и моя терминология может быть неправильной, но я думаю, что NAME - это текущий токен (тот, который дал лексер), а EQUALS/PLUS будет первым маркером с перспективой (тот, который вы «заглянуть», но на самом деле не поп). – Mephy