#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:
Синтаксический анализатор-это инструмент, позволяющий определить, является ли определенный ввод синтаксически правильным, и может преобразовать ввод в определенную структуру данных, если это так (как объяснил Майк Каргал). Это означает, что синтаксический анализатор-это инструмент для работы с синтаксисом входных данных.
Указание типов и другой метаинформации входных данных означает применение значения к определенным строкам, что обычно называется семантической обработкой.
Знание того, что синтаксический анализатор является инструментом синтаксиса, должно прояснить, что синтаксический анализатор нельзя использовать для применения семантики. Важно различать синтаксис и семантику, чтобы понять, какой инструмент может что делать.
Как применять семантику так, как вы, по-видимому, хотите, — это отдельная тема и слишком широкая, чтобы ее можно было решить в одном вопросе.