Явные типы данных в Antlr4

#java #parsing #token #antlr4 #abstract-data-type

Вопрос:

я новичок в Antlr и пишу на java, и в настоящее время я пытаюсь понять, как заставить анализатор идентифицировать токен «var» как int, строку и т. Д. Точно так же, как в javascript, где вы используете либо var, либо let. Я пытаюсь создать свой собственный язык программирования, который имеет явные типы данных, чтобы новичку было легче начать кодирование, не беспокоясь о том, использует ли он/она int/строку/символ и так далее.

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

Ответ №1:

На самом деле это не та задача, которую вы могли бы выполнить непосредственно с помощью ANTLR.

ANTLR генерирует код для создания синтаксического анализатора для вас. Это означает, что он обработает ваши входные данные и создаст структуру данных (дерево синтаксического анализа в случае ANTLRs), которая правильно катагорирует все ваши входные данные (при условии, что они синтаксически верны; в противном случае появится сообщение об ошибке).

В вашем случае у вас будет синтаксическое дерево, которое правильно определит, что у вас есть var ключевое слово, идентификатор (имя вашей переменной) = и значение. Это, вероятно, было бы результатом сопоставления с правилом синтаксического анализа для чего-то подобного assignmentStmt .

С этим синтаксическим деревом в памяти у вас будут классы слушателей и/или посетителей, которые генерирует ANTLR, чтобы упростить навигацию по этому синтаксическому дереву.

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

Задача Antlr состоит в том, чтобы правильно идентифицировать все части в соответствии с вашим синтаксисом (проверка типов-это семантическая задача, а не то, чем занимается синтаксический анализатор). Он не создает таблицы символов для вас и не пытается сделать вывод типа. Это задачи, которые решаются вами после анализа входных данных.

Обратите внимание, что JavaScript не типизирован, поэтому у вас просто есть переменная или константа, которая может содержать что угодно, нет типа (выведенного или явного).

Явный ввод текста был бы чем-то вроде:

 var myString : String;
 

Неявная типизация была бы чем-то вроде:

 var myVar = "String"
 

и у вас будет код, в котором, по сути, говорится: «Они присвоили строку myVar so, отныне myVar это строковый тип и не будет принимать никаких значений, кроме строки.

В JavaScript вы просто получаете переменную, и вы можете развернуться, присвоив ей числовое значение, объект или что угодно (оно не имеет типа).

Комментарии:

1. Большое спасибо за быстрый ответ, я буду больше заниматься выводом типов!

Ответ №2:

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

Указание типов и другой метаинформации входных данных означает применение значения к определенным строкам, что обычно называется семантической обработкой.

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

Как применять семантику так, как вы, по-видимому, хотите, — это отдельная тема и слишком широкая, чтобы ее можно было решить в одном вопросе.