Прополка после разбора - PullRequest
       3

Прополка после разбора

0 голосов
/ 06 февраля 2012

После сканирования и разбора. У меня есть последовательность действительных токенов. У меня есть правила, которые не улавливаются синтаксическим анализатором, например «Класс не может быть одновременно абстрактным и окончательным». Поскольку таких правил много, как я могу эффективно отсеять эти случаи?

Я пишу свой Java-компилятор на C ++

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

«Правила» о допустимых структурах обычно называются «статической семантикой».Для обработки таких правил обычно требуется:

  • Абстрактное синтаксическое дерево программы и тех сущностей, на которые она ссылается (например, другие программы, классы и т. Д.)
  • Таблица символов, которая связана с каждым идентификатором, объявление, относящееся к этому идентификатору, и ключевая информация, связанная с этим объявлением, обычно называемая «типом»
  • Способность вычислять тип каждого составного фрагмента текста.(например, выражения)

С помощью этой информации вы реализуете практически всю статическую семантику.Например, «класс не может быть как окончательным, так и абстрактным», требует, чтобы символ для класса был связан со свойствами final и abstract, чтобы ваш синтаксический анализатор / символ выполнял эту связь, когда он встречает объявления, и чтобы вы фактически сканировалиЗаписи таблицы символов после того, как они все построены, и проверьте, чтобы оба свойства не присутствовали одновременно.(Вы можете реализовать это другими способами, но чистый эффект тот же).

Можно проверить некоторые вещи без всего этого механизма, если они случайно оказываются на вашем языке, «рядом» с каждымДругой.Я не эксперт по Java, но если «abstract» и «final» должны быть объявлены для одного и того же удаления класса, вы можете взломать проверку, которая запрещает эти ключевые слова рядом с ключевым словом «class», но это простобыть взломанным и не будет надежным при любых обстоятельствах.

Вы подразумеваете, что пишете (полный) Java-компилятор, говоря «ваш компилятор» и «У меня есть правила (которые должны быть обнаружены)».Вам нужно будет собрать все вышеперечисленное или просто принять чью-либо еще законченную версию всего этого.Вы обнаружите, что создание всех этих элементов не легко для людей, которые знакомы с ними, потому что современные языки, такие как Java, имеют очень сложные грамматики, правила области видимости и системы типов.

Учитывая, что вы, кажется, не знакомы с необходимостью в них и еще даже не пытались построить AST, я думаю, что ваши надежды на получение результата в ближайшей перспективе не очень хороши.Я предлагаю вам пересмотреть свои цели;если вы студент, прежде чем начать, вам нужно больше знаний.

0 голосов
/ 06 февраля 2012

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

Например, у вас может быть класс C ++ для узла Java "класс", и при создании этогоУзел во время синтаксического анализа, вы можете проверить любые связанные правила и выдать исключение, если какое-либо правило нарушено.

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