#compiler-construction #backend #abstract-syntax-tree
#построение компилятора #серверная часть #абстрактное синтаксическое дерево
Вопрос:
У меня есть DSL с интерфейсом Java, и я хотел бы сериализовать AST, который я получаю во интерфейсной части, в какой-нибудь легко анализируемый формат, чтобы упростить написание серверной части, которая генерирует код на разных языках программирования. Есть ли что-нибудь лучше XML для этой цели?
Ответ №1:
XML создает много текста, а ASTS могут быть феноменально большими. (Я создаю синтаксические анализаторы и) наши анализаторы будут выдавать XML, потому что этого требовали наши клиенты… но ни один из них на самом деле его не использует. ИМХО, лучше разработать пользовательский формат, который плотно кодирует ваше дерево, чтобы избежать времени, необходимого для чтения и записи AST. Например, вы могли бы согласиться на:
( nodetype =value childnodes )
где ( ) — круглые скобки, с ( открывая узел дерева, nodetype — это целое число, представляющее тип узла [возможно, даже в формате с большим радиусом, чтобы минимизировать количество символов], = присутствует, если узел содержит значение [вам действительно не нужен знак =, если вы подумаете об этом], и значение предоставляется. Дочерние узлы встроены перед закрытием); если они присутствуют, они, очевидно, начинаются с левого paren. Пробелы не нужны! Если вам действительно иногда нужно это прочитать, вы можете создать простой тупой инструмент для отступа от круглых скобок, когда вам нужно это увидеть.
[Старожилы распознают это как S-выражения LISP, и это существует с конца 1950-х годов в виде древовидной кодировки].
(Мы избегаем этого в значительной степени, потому что чтение и запись деревьев обходятся дорого, независимо от того, как вы это делаете, и часто просто проще и эффективнее завершить обработку дерева, которое у вас есть в памяти, и просто выдать окончательный ответ).
Комментарии:
1. Я почти всегда использую S-выражения, подобные описанным выше. Таким образом, серверная генерация может быть выполнена с использованием привязок функций и вычисления. (например, 1 2 становится ( 1 2), а » » вычисляется функцией, которая знает, что создавать для себя, «1» и «2.») Вы также можете использовать постфиксные выражения, которые быстрее сериализуются, но их сложнее читать и сложнее привязать к чему-то другому, кроме стековой машины.