Как мне реализовать разбор? - PullRequest
1 голос
/ 08 ноября 2010

Я проектирую компилятор на C. Я хочу знать, какую технику я должен использовать, сверху вниз или снизу вверх? Я реализовал только приоритет оператора, используя снизу вверх. Я применил следующее правила:

E:=E+E
E:=E-E
E:=E/E
E:=E*E
E:=E^E

Я хочу знать, что я иду прямо сейчас? Если я хочу включить if-else, циклы, массивы, функции, мне нужно реализовать синтаксический анализ? Если да, то как мне это реализовать? Любой может Я реализовал только сбор токенов и приоритет операторов. Каковы следующие шаги?

Ответы [ 4 ]

9 голосов
/ 08 ноября 2010

Lex & Yacc - ваш ответ.Или Flex и Bison, которые являются разветвленной версией оригинальных инструментов.

Они бесплатны, они являются настоящим стандартом для написания лексеров и синтаксических анализаторов на C и используются повсеместно.

Кроме того, O 'Reilly выпустила небольшую жемчужину из 300 страниц: Flex & Bison .Я купил его, и он действительно объясняет вам, как написать хороший синтаксический анализатор для языка программирования и обрабатывать все тонкие вещи (восстановление после ошибок, конфликты, области действия и т. Д.).Он также ответит на ваши вопросы о том, как вы анализируете выражения: ваш подход правильный с нисходящим парсером, но вы обнаружите, что этого недостаточно для обработки приоритетов операторов.

Конечно, для хобби вымог бы написать свой собственный лексер и парсер, но это было бы просто академическим усилием, которое приятно понять, как работают FSM и парсер, но без особого веселья:)

Если вы, вместо этого, интересуетесь дизайном языка программированияили сложные реализации Я предлагаю эту книгу: Прагматика языка программирования , которая не столь известна из-за Книга Дракона , но она действительно объясняет, почемуи как различные характеристики могут и должны быть реализованы в компиляторе.«Книга Дракона» - это тоже Библия, и на самом низком уровне она расскажет, как написать синтаксический анализатор… но я предупреждаю, что это будет скучно…

1 голос
/ 08 ноября 2010

Ваш вопрос довольно расплывчатый, и на него трудно ответить без более конкретного и подробного вопроса. "Книга Дракона" является отличным справочником, хотя для тех, кто хочет реализовать компилятор с нуля, или, как другие отмечали, Lex и Yacc.

1 голос
/ 08 ноября 2010

Лучший способ реализовать хороший синтаксический анализатор в C - это использовать flex & yacc

0 голосов
/ 09 ноября 2010

Если вы намереваетесь внедрить парсер вручную, вам понадобится парсер рекурсивного спуска . Код напрямую отражает грамматику, поэтому его довольно легко понять и понять. Это накладывает некоторые ограничения на вашу грамматику (вы не можете иметь никаких леворекурсивных нетерминалов), но вы можете обойти эти проблемы.

Однако это зависит от сложности грамматики; ручной взлом парсера для чего-то намного более сложного, чем базовые арифметические выражения, становится очень утомительным очень быстро. Если вы пытаетесь реализовать что-либо, похожее на настоящий язык программирования, используйте генератор синтаксических анализаторов, например yacc или bison.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...