Какова наилучшая практика для обработки сложных литералов в Rascal?Обработка лексических программ в Rascal
Два примера из JavaScript (мой DSL имеет подобные случаи):
- Строка с
\
побегами - должно быть незаменяемым в реальную стоимость. - Литералы регулярного выражения - нуждаются в собственном суб-АСТ.
implode
отказывается карту лексических абстрактных деревьев, они, очевидно, handed differently из синтаксических производств, несмотря на наличие полных разбора деревьев доступны. Например, следующий синтаксический анализатор не может с IllegalArgument("Missing lexical constructor")
:
module lexicals
import Prelude;
lexical Char = "\\" ![] | ![\\]; // potentially escaped character
lexical String = "\"" Char* "\""; // if I make this "syntax", implode works as expected
start syntax Expr = string: String;
data EXPR = string(list[str] chars);
void main(list[str] args) {
str text = "\"Hello\\nworld\"";
print(implode(#EXPR, parse(#Expr, text)));
}
Единственная идея, которую я до сих пор, чтобы захватить все лексические в качестве исходных строк, а затем повторно проанализировать их (лопается и все) с использованием отдельно определенный синтаксиса без разметки пробельного , Надеюсь, есть лучший способ.
Маркировка с помощью "string:" конфликтует с существующим конструктором. Маркировка с помощью чего-то еще («string1:») приводит к «Не удается найти конструктор для EXPR». (У меня есть последняя ошибка с моими фактическими определениями, используя версию 0.7.2.201501130937). Мои АСТ очень близки к грамматике (это типичная грамматика «Expr»), но мне нужно применить много терминов переписывания (канонизация и оптимизация), поэтому я пошел с Rascal в первую очередь: это простой, но практичный язык, который имеет как синтаксический анализ, так и переписывание встроенных. –
Я думаю, что это можно решить, разбив их на 2 модуля. И действительно, мошенник - очень хороший язык для разбора и переписывания. И, в определенной степени, это возможно и при разборе деревьев. –
Пошаговое развязывание и ручное сопоставление деревьев синтаксического анализа с «основным языком», вероятно, лучше, чем репарация лексики, я поеду с ним. Обсуждение. Я понимаю идеи работы в конкретном синтаксисе (вентилятор TXL здесь), но это ДЕЙСТВИТЕЛЬНО неудачно, что Rascal движется в этом направлении. Неизменяемые данные и встроенный backtracking ('fail') делают его идеальным хозяином для классического подхода« парсер с использованием АСТ ». Легкий синоним построения дерева (a la ANTLR 3) + автоматическое оформление с данными компоновки (пробелы и комментарии) + автоматическое разделение ... Можно мечтать. –