Facc позволяет использовать выражения с левой рекурсией по своему усмотрению.
Приоритет необходимо обрабатывать самостоятельно. Например, следующие четыре операции:
op2_expr ::= expr (op2_sign expr)+
Вышеупомянутое op2_expr может соответствовать:
Используя этот метод, вычисления одного уровня в AST-дереве перечисляются параллельно, а затем вручную определяется способ вычисления на основе приоритета символов.
Например, для идентификации идентификатора требуется буквенно-цифровой символ и китайский иероглиф, и он не должен начинаться с цифры. По умолчанию он делится на две части:
id ::= [a-zA-Z\u0100-\uffff_] [0-9a-zA-Z\u0100-\uffff_]*
С помощью метода PrintTree
можно увидеть, что первый символ и последующие символы разделены, образуя две части, что создаёт неудобства при использовании ID. Здесь можно добавить метод расширения:
static class AstExtensionMethods {
public static string Value (this IdAST _a) => $"{_a.Value_0}{_a.Value_1}";
}
При последующем ручном анализе AST можно получить строку идентификатора через id.Value ()
. Другие структуры AST также могут выполнять аналогичные операции, упрощая анализ и обработку AST.
Facc предоставляет альтернативный способ расширения методов, используя пользовательский код генерации. Эта функция позволяет разработчикам встраивать строковый код в методы AST.
Способ использования (сначала обратите внимание на пример кода):
_generator.Generate (null);
Здесь есть параметр, который мы просто передаём как null. Теперь замените его объектом словаря, где ключ означает имя класса, а значение — добавляемый строковый код. Просто сопоставьте класс и код, который нужно добавить, чтобы эта функция вставила соответствующий код в анализатор AST. Пример:
var _ext_code = new Dictionary<string, string> {
["ExprAST"] = "public int UserData = 0;",
};
_generator.Generate (_ext_code);
Сравнение преимуществ и недостатков метода расширения и этого метода:
Разработчики могут быть удивлены тем, что для встраивания кода необходимо передать имя класса, а не идентификатор grammar. Причина такого дизайна заключается в том, что если существует вложенная структура, такая как:
op2_expr ::= expr (op2_sign expr)+
Тогда будут созданы два класса: Op2ExprAST и Op2ExprAST_1, последний используется для описания синтаксической структуры op2_sign expr
. Указание имени класса позволяет правильно различать уровни вложенности grammar.
В проекте Facc.Example
приоритет распознаётся и настраивается вручную с использованием пользовательского кода генерации. Для получения дополнительной информации обратитесь к примеру.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )