Чтобы использовать syntax module его надо модифицировать или это опечатка? Если не опечатка, это очень печальное требование, нарушающее принцип open/closed из SOLID.
syntax module Expression
{
using ExpressionPlusesExtention; // импорт расширяющих правил
... // все как в примере приведенном выше
}
syntax module ExpressionPlusesExtention
{
using cp = Expression; // псевдоним для синтаксического модуля CalcParser
Plus is cp.Expr = '+' expr @ Unary
PrefixInc is cp.Expr = "++" expr @ Unary;
PostfixInc is cp.Expr = expr @ Primary "++";
}
Вот по этому коду:
Number = digits s
{
where digits : Digits;
Value : decimal = decimal.Parse(GetText(digits));
}
Синтаксис выглядит не очень логично. В большинстве языков декларативные констрейнты отделяются от кода, может быть сделать как-то так?
Number = digits s
where digits : Digits // например так, where придется сделать зарезервированным в грамматике словом, как using
{
Value : decimal = decimal.Parse(GetText(digits));
}
Или так:
Number = $(digits : Digits) s
{
Value : decimal = decimal.Parse(GetText(digits));
}
Ну и совсем мелочь, стоит ли тащить из первой версии названия типов вроде NToken? Читая такой тип я предполагаю, что есть менее специализированный Token, а этот отличается тем, что он N. Что значит N догадки возникают, но уверенности в них никакой. Про всякие assert2, ImpicitCTX, я думаю даже говорить не надо.
Здравствуйте, Ziaw, Вы писали:
Z>Чтобы использовать syntax module его надо модифицировать или это опечатка? Если не опечатка, это очень печальное требование, нарушающее принцип open/closed из SOLID.
Это просто возможность разбить один модуль на два.
Не более того.
Выше же написано что можно и без взаимных ссылок работать.
Z>Синтаксис выглядит не очень логично. В большинстве языков декларативные констрейнты отделяются от кода, может быть сделать как-то так?
Над синтаксисом еще работать и работать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
s : void = ' '*;
Не является лексерным правилом. И не может быть использовано внутри лексерных правил.
Также не забудь написать про то что лексерные правила не поддерживают рекурсию.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, VladD2, Вы писали:
WH>s : void = ' '*; WH>Не является лексерным правилом.
Спорный вопрос, ну да будь по твоему. Поправил.
WH>И не может быть использовано внутри лексерных правил.
ОК, исправил.
WH>Также не забудь написать про то что лексерные правила не поддерживают рекурсию.
Это написано ниже.
• Лексические – разбирающие лексемы (token-ы, последовательности символов считающеюся минимальными единицами языка). Перед лексическим правилом ставится ключевое слово «token». Такие правила могут использовать только регулярные грамматики, так как в итоге они преобразуются в детерминированный конечный автомат (ДКА). В лексических правилах разрещается использовать оператор «альтернатива» – «|». Как и в БНФ или регулярных выражениях этот оператор не задает приоритет правил, так что порядок правил в нем не влияет на разбор. В лексических правилах недопустимо использование расширяемых правил или ссылаться на синтаксические правила.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
WH>>Также не забудь написать про то что лексерные правила не поддерживают рекурсию. VD>Это написано ниже.
В каком месте?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>>>Также не забудь написать про то что лексерные правила не поддерживают рекурсию. VD>>Это написано ниже. WH>В каком месте?
В браузере нет поиска?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, _Claus_, Вы писали:
_C_>using внутри макроса режет глаз. есть же механизм алиасов, если шо, зачем оно, если можно как обычно.и компилятору легче.
Что-то я совсем не понял сказанного. Что не так с "using"?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Думаешь фразу "могут использовать только регулярные грамматики" не поймут?
Вот ты не понял.
VD>Или рекурсия к себе же тоже запрещена?
Конечно.
Есть, конечно, частные случаи рекурсии, которые можно поддержать. Но проще запретить. Ибо смысла в них все равно нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
VD>Что-то я совсем не понял сказанного. Что не так с "using"?
По моему — логичней было бы сохранить для using обычный смысл. открытия namespace вверху. описания будет меньше. и привычней.
например
using standartNPrimirive;
using standartNCycle;
//дальше описываем новые циклы
syntax module for1
..
syntax module for2
..
syntax module foreach1
..
в предлагаемом в документе варианте, насколько я понимаю, эти верхние 2 строки будут дублироваться внутри каждого описываемого цикла.
что видится нерациональным при здравой компоновке. если же глобальная доступность предусмотрена также (как описал выше), то можно
и оставить. кушать оно не просит.
Здравствуйте, _Claus_, Вы писали:
_C_>По моему — логичней было бы сохранить для using обычный смысл. открытия namespace вверху. описания будет меньше. и привычней.
Обычный смысл сохранится. Просто мы используем эту же конструкцию для импорта одной грамматики в другую. Вводить для этого новый синтаксис считаю излишним.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
syntax module Literal
{
token Digit = ['0'..'9'];
token Digits = Digit+ ('.' Digit+)?;
s : void = ' '*;
Number = digits:Digits s
{
// where digits : Digits;
Value : decimal = decimal.Parse(GetText(digits)); //круто
}
}
спецшаблон s мне не нравиться, если возможно то лучше вынести его в макросы синтаксиса.
как я понимаю если в одном модуле определен порядок данной операции то в другом он не может быть определен или может быть переопределен или быдет выбираться произвольным порядком?
Как быть если порядок определен разным в разных независимых библиотеках(например для разных типов)?
«scope» — октрывает новую область видимости. Области видимости используются для управлению сервисами компилятора, такими как «связывание имен» или «динамическое расширение грамматики».
Для унификации я все таки добавил бы не = ,а например ===, может и многословно и длинно, зато четко выделено, где унификация(или у вас ограниченная унификация???), а где присвоение. В принципе унификацией в языке можно заменить == и = и match. B вообще внести надо в сам Н2.
И вообще стоило бы сделать объявление def a=1; так как сделано в Go a:=1; если := то определение переменной если = то присвоение.
На счет ConstValue. Сделано крайне муторно, но сам факт что не забыли уже плюс.
будет всегда работать даже если не совпадают типы?
N2 поддерживает области видимости (scopes). Области видимости нужны для организации разного рода контекстных сервисов и действий. В частности области видимости нужны для работы сервиса разрешения имен (таблицы символов), или, например, для динамической загрузки синтаксических расширений.
Это о чем????
Здравствуйте, Аноним, Вы писали:
А>разрешил бы писать так... А>
А> Number = digits:Digits s
А>
Можно и так. Об этом подробно написано ниже где отписывается синтаксис.
А>спецшаблон s мне не нравиться, если возможно то лучше вынести его в макросы синтаксиса.
"Шаблоны"... "макросы" в данном контексте вещи не определенные. Правило s и S — предопределены, так как без них вообще невозможно обойтись, но их описание можно заменить.
А>как я понимаю если в одном модуле определен порядок данной операции то в другом он не может быть определен или может быть переопределен или быдет выбираться произвольным порядком? А>Как быть если порядок определен разным в разных независимых библиотеках(например для разных типов)?
Вообще не понял о чем идет речь. Что понимается под операций и что понимается под порядком?
А>«scope» — октрывает новую область видимости. Области видимости используются для управлению сервисами компилятора, такими как «связывание имен» или «динамическое расширение грамматики».
Опять не понял. Не ясен смысл слова "открывает"?
А>Для унификации я все таки добавил бы не = ,а например ===, может и многословно и длинно, зато четко выделено, где унификация(или у вас ограниченная унификация???), а где присвоение. В принципе унификацией в языке можно заменить == и = и match. B вообще внести надо в сам Н2.
Что понимается под унификацией? Унификация, как таковая, будет применяться только в констрэйнах на типы (для описания вывода типов). Если речь о дополнительных полях, то там речь идет не об унификации, а об более простом понятии эквивалнтности. От унификации оно будет отличаться тем, что не поддерживает паттерн-матчинг. Поля предназначены для передачи значений. Но нам нужно сделать эту передачу нелинейной (в разные стороны) и безопасной. Причем все это в условиях когда правила компилируются независимо.
А>И вообще стоило бы сделать объявление def a=1; так как сделано в Go a:=1; если := то определение переменной если = то присвоение.
Это к делу не относится вообще. Базовый язык Немерл. И менять его пока никто не собирается.
А>На счет ConstValue.
Что кажется мутным?
А>Сделано крайне муторно, но сам факт что не забыли уже плюс.
Два примера. Во втором добавлено дополнительное поле для демонстрации его использования. В прочем, рассматривать пример в связке особого смысла нет.
А>
будет всегда работать даже если не совпадают типы?
Ох, опять приходится телепатировать. Типы Expr1.ConstValue?
Будет. Смотри реализацию функции TrySumLiterals. Она проверяет реальные типы и в случае их несовпадения возвращает ConstValue.Nine(). Тут уже нужно быть знакомым с алгебраическими типами, чтобы понять суть происходящего.
А>N2 поддерживает области видимости (scopes). Области видимости нужны для организации разного рода контекстных сервисов и действий. В частности области видимости нужны для работы сервиса разрешения имен (таблицы символов), или, например, для динамической загрузки синтаксических расширений. А>Это о чем????
Об областях видимости, ваш КО
Можно задавать вопросы более конкретно? Если что-то не понятно, то просьба объяснять причины непонимания или объяснять как это понял ты. А то я просто не знаю что отвечать, а мой телепатический цент на грани сбоя.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
А>>как я понимаю если в одном модуле определен порядок данной операции то в другом он не может быть определен или может быть переопределен или быдет выбираться произвольным порядком? А>>Как быть если порядок определен разным в разных независимых библиотеках(например для разных типов)?
VD>Вообще не понял о чем идет речь. Что понимается под операций и что понимается под порядком?
В одной библиотеке Петя добавил exp ^^ exp
В другой библиотеке Костя добавил exp ^^ exp
и как это будет все работать?
А>>«scope» — октрывает новую область видимости. Области видимости используются для управлению сервисами компилятора, такими как «связывание имен» или «динамическое расширение грамматики». VD>Опять не понял. Не ясен смысл слова "открывает"?
У тебя орфографическая ошибка в статье. Я ее подчеркнул.
А>>Для унификации я все таки добавил бы не = ,а например ===, может и многословно и длинно, зато четко выделено, где унификация(или у вас ограниченная унификация???), а где присвоение. В принципе унификацией в языке можно заменить == и = и match. B вообще внести надо в сам Н2.
VD>Что понимается под унификацией? Унификация, как таковая, будет применяться только в констрэйнах на типы (для описания вывода типов). Если речь о дополнительных полях, то там речь идет не об унификации, а об более простом понятии эквивалнтности. От унификации оно будет отличаться тем, что не поддерживает паттерн-матчинг. Поля предназначены для передачи значений. Но нам нужно сделать эту передачу нелинейной (в разные стороны) и безопасной. Причем все это в условиях когда правила компилируются независимо.
Не понятно тогда почему не сделать унификацию полностью? Что мешает? Чему мешает?
VD>Ох, опять приходится телепатировать. Типы Expr1.ConstValue? VD>Будет. Смотри реализацию функции TrySumLiterals. Она проверяет реальные типы и в случае их несовпадения возвращает ConstValue.Nine(). Тут уже нужно быть знакомым с алгебраическими типами, чтобы понять суть происходящего.
Извиняюсь, там я не заметил
abstract Expr
{
ConstValue : ConstValue;
}
Вообще слово abstract сбивает с толку но это дело привычки
VD>Об областях видимости, ваш КО
Не понятно зачем они тут нужны и как и когда их использовать.