Что содержит переводчик? - PullRequest
       21

Что содержит переводчик?

0 голосов
/ 20 февраля 2019

Я использую Antlr4 для создания интерпретатора, лексера и парсера.Графический интерфейс, в котором он будет использоваться, содержит QScintilla2.

Поскольку QScintilla не нуждается в синтаксическом анализаторе и имеет модуль CustomLexer, будет ли достаточен интерпретатор (Antlr4 встроенный, цель Python3)?

Я спрашиваю не мнения, а фактические рекомендации.Спасибо.

1 Ответ

0 голосов
/ 22 февраля 2019

Что содержит интерпретатор

Интерпретатор должен иметь какой-то способ синтаксического анализа кода, а затем какой-то способ его запуска.Обычно «способ синтаксического анализа кода» обрабатывается с помощью синтаксического анализатора lexer +, но также возможен синтаксический анализ без лексера.В любом случае, синтаксический анализатор создаст некоторое промежуточное представление кода, такое как дерево или байт-код.«Способ его запуска» будет фазой, которая перебирает сгенерированное дерево или байт-код и выполняет его.JIT-компиляция (т.е. генерирование машинного кода из дерева или байт-кода и последующее его выполнение) также возможна, но более продвинута.Вы также можете запускать различные анализы между синтаксическим анализом и выполнением (например, вы можете проверить, используются ли какие-либо неопределенные переменные или используются где-либо, или вы можете выполнять статическую проверку типов - хотя последняя редко используется в интерпретируемых языках).

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

QScintilla - это отображениеязык и не связан с переводчиком.В IDE консоль - это место, где интерпретатор вступает в игру вместе с запуском сценария (например, с помощью кнопки «Выполнить»).Единственное, что является общим для QScintilla и интерпретатора, это файл сценария - интерпретатор не связан или не связан с QScintilla.Имеет ли это основной смысл?

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

Вы специально упомянули кнопку «Выполнить» и какЧто касается этого, то реализация интерпретатора (и использует ли он ANTLR) не имеет абсолютно никакого значения.На самом деле даже не имеет значения, на каком языке написан переводчик. Если ваш переводчик имеет имя mylangi и вы в настоящее время редактируете файл с именем foo.mylang, то нажатие кнопки «Выполнить» должно просто выполнить subprocess.run(["mylangi", "foo.mylang"])и отображать результат в какой-то вкладке или окне.

То же самое, если вы хотите иметь окно "консоли" или "REPL", где вы можете взаимодействовать с интерпретатором: вы просто вызываете интерпретатор как подпроцесс иподключите его к вкладке или подокну, отображающему консоль.Опять же, реализация интерпретатора для этого не имеет значения - вы относитесь к ней как к любому другому приложению командной строки.

Теперь другими функциями, которые есть в IDE и редакторах кода, являются подсветка синтаксиса, автозаполнение и подсветка ошибок.

Для подсветки синтаксиса вам нужен код, который проходит через исходный код и сообщает редактору, какие части кода должны иметь какой цвет (или жирный шрифт и т. Д.).Используя QScintilla, вы выполняете это, предоставляя класс лексера, который это делает.Вы можете определить такой класс, просто написав необходимый код для определения типов токенов вручную, но вы также можете повторно использовать лексер, сгенерированный ANTLR.Так что это один из способов, которым реализация вашего интерпретатора может быть повторно использована в редакторе / IDE.Однако, поскольку подсветка синтаксиса обычно довольно проста для написания от руки, вам не нужно делать это таким образом.

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

Для выделения ошибок вы можете просто вызвать интерпретатор в режиме «только проверка» (т.е. распечатывать только синтаксические ошибки и другие ошибки, которые могут быть обнаружены статически, но на самом деле не запускать файл - у многих интерпретаторов есть такая опция), а затемпроанализируйте вывод, чтобы узнать, где нарисовать волнистые линии.Но вы также можете повторно использовать анализатор (и анализировать, если он у вас есть) вместо вашего интерпретатора.Если вы выберете языковой сервер, ошибки и предупреждения также будут обрабатываться языковым сервером.

...