Грамматическая помощь (Теория автоматов)?

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

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

1 ответ

Вы не можете "написать грамматику для выражения [an]". Грамматика - это правила производства. Простой пример:

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

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

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

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

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

  _ + _
2        *
      3/   \5

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

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

Другие вопросы по тегам