Вы не можете «написать грамматику для [an] выражения».Грамматика - это правила производства.Простой пример:
S -> (S)
S -> SS
S -> [empty]
Вы видите, что делает эта грамматика?
По сути, это позволяет генерировать строки типа "", "()", "((() ()) ())".Заметьте, я сказал «сгенерировать» - по логике вы начинаете с одного «S», а затем работаете, заменяя каждый S на «производство» справа.Но ключ в том, что любая строка, которую вы генерируете этим методом, является «грамматически правильной» в формальном смысле.
Синтаксический анализ является противоположностью этому - превращение строки в соответствующий порядок производств.Грамматика неоднозначна, если это можно сделать несколькими способами.
Когда вы пишете компилятор, сначала вам нужно «лексировать» ввод.2 + 3 * 5 должно быть заключено в нечто вроде NUM ADD NUM TIMES NUM (каждый из них является токеном).Затем вы анализируете токены на основе грамматики, чтобы создать «синтаксическое дерево», возможно, что-то вроде:
_ + _
2 *
3/ \5
Вам нужно будет написать правила для производства так, чтобы единственными вещами, которые могутбыть сгенерированным.Это немного сложно и немного искусно, поэтому я не могу помочь без более подробной информации.
Приоритет обрабатывается различными нетерминалами (например, S и T).У настоящего парсера их будет десятки.С сотнями.Умело выстраивая их, вы заставляете некоторые вещи сопоставляться с другими.