Помощь по грамматике (теория автоматов)?

Привет, ребята, у меня есть вопрос, простой вопрос с Automaton, я не уверен, правильно ли это место, чтобы задать такой вопрос. На самом деле в этом году у меня есть курс Compiler Construction, и если кто-нибудь знает какой-нибудь хороший ресурс, было бы неплохо опубликовать его здесь.

Сначала у меня очень простой вопрос: например, у меня есть выражение вроде: 2+3*5 , как написать грамматику для этого выражения? Я имею в виду один неоднозначный и один недвусмысленный пример. Спасибо.


person Samuel    schedule 11.11.2011    source источник
comment
На самом деле я не уверен, понял ли я вопрос?   -  person Samuel    schedule 12.11.2011
comment
Довольно сложно разработать грамматику, учитывая только один пример...   -  person Oliver Charlesworth    schedule 12.11.2011
comment
Я имею в виду, как сделать так, чтобы синтаксический анализатор начинался с оператора *, а не с оператора +, так как мы знаем, что * имеет более высокий приоритет, поэтому какую грамматику нужно написать для этого случая, чтобы синтаксический анализатор начал вычисление с *, и как я знаю ANTLR использует синтаксический анализ сверху вниз, поэтому не могли бы вы дать мне грамматику для этого случая?   -  person Samuel    schedule 12.11.2011


Ответы (1)


Вы не можете «написать грамматику для выражения». Грамматики — это правила производства. Простой пример:

S -> (S)
S -> SS
S -> [empty]

Вы видите, что делает эта грамматика?

По сути, это позволяет вам генерировать такие строки, как "", "()", "((()())())". Обратите внимание, я сказал «сгенерировать» — логически вы начинаете с одной «S» и работаете дальше, заменяя каждую S некоторым «производством» справа. Но суть в том, что любая строка, сгенерированная этим методом, является «грамматически правильной» в формальном смысле.

Синтаксический анализ является обратным: преобразование строки в соответствующий порядок производства. Грамматика неоднозначна, если это можно сделать более чем одним способом.

Когда вы пишете компилятор, сначала вам нужно «лексировать» ввод. 2+3*5 следует преобразовать в что-то вроде NUM ADD NUM TIMES NUM (каждый из них является токеном). Затем вы анализируете токены на основе грамматики, чтобы построить «синтаксическое дерево», возможно, что-то вроде:

  _ + _
2        *
      3/   \5

Вам нужно будет написать правила для производства, чтобы допустимые строки были единственными вещами, которые могут быть сгенерированы. Это немного сложно, и немного искусства, так что я не могу помочь без более подробной информации.

Приоритет обрабатывается разными нетерминалами (например, S и T). В реальном парсере их будет несколько десятков. C имеет сотни. Умело располагая их, вы заставляете одни вещи сопоставляться раньше других.

person Robert    schedule 11.11.2011