172 похожих чатов

@Eliah_lakhin как в lady_deirdre указать "любой символ" в макросе rule? enum

SomeToken {
#[rule("/*" & ??? & "*/")]
MultilineComment
}

19 ответов

18 просмотров

С помощью . точки.

Andrei- Автор вопроса
Ilya Lakhin
С помощью . точки.

#[rule("/*" & . & "*/")] даёт mistmatch на "/* hello */"

Andrei- Автор вопроса
Ilya Lakhin
С помощью . точки.

Всё разобрался. Спасибо.

Andrei
#[rule("/*" & . & "*/")] даёт mistmatch на "/* hel...

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

Andrei- Автор вопроса
Ilya Lakhin
. матчит ровно один символ. Но я бы вообще не реко...

Я пока плохо ориентируюсь в парсерной тематике. Сначала разберусь как работает ваш проект, потом попробую прикрутить его к своему скрипту, а потом уже думаю придёт понимание как выстраивать архитектуру парсера.

Andrei- Автор вопроса
чоузапон
Блять что это

Макрос, определяющий правило разбора для лексического анализатора.

Andrei- Автор вопроса
Andrei- Автор вопроса
чоузапон
Сделал ещё хуже

Если по простому, то лексический анализ это один из этапов, который помогает компилятору «понять» что написано в файле с исходным кодом.

Andrei- Автор вопроса
Ilya Lakhin
. матчит ровно один символ. Но я бы вообще не реко...

А как в синтаксическом анализаторе указать "любой символ"? На точку он ругается.

В синтаксическом анализаторе придётся перечислять все возможные варианты вручную. Примерно вот так: #[rule(terminals: ( $True | $False | $Query | $Dot | $Dot2 | $Assign | $Plus | $PlusAssign | $Minus | $MinusAssign | $Mul | $MulAssign | $Div | $DivAssign | $And | $Or | $Not | $BitAnd | $BitAndAssign | $BitOr | $BitOrAssign | $BitXor | $BitXorAssign | $BitRem | $BitRemAssign | $Lesser | $LesserOrEqual | $Greater | $GreaterOrEqual | $Equal | $NotEqual | $Ident | $Int | $Float )+)] Terminals { terminals: Vec<TokenRef> }, В этом моменте пока есть неудобство. Надеюсь, что не слишком критическое.

Andrei- Автор вопроса
Ilya Lakhin
В синтаксическом анализаторе придётся перечислять ...

Как в таком случае распарсить комментарий // в синтаксическом анализаторе? Я думал это будет вот так: #[rule($CommentStart & (.) & LineBreak+)] LineComment {},

Andrei
Как в таком случае распарсить комментарий // в син...

именно так, только лучше использовать * вместо +, потому что у тебя коммент может быть в конце файла

Andrei
Как в таком случае распарсить комментарий // в син...

Ну, я вот у себя буквально так и сделал. Я сделал #[define Any = $A | $B ...], в котором перечислил все токены, кроме токенов коммента. И потом использовал его как #[comment] #[rule( $InlineComment & (Any | $MultilineCommentStart | $MultilineCommentEnd)* & $Linebreak? )] InlineComment, Так же не забудьте поставить #[comment] метку. Если такую метку поставить, то коммент будет парситься автоматически во всех правилах(кроме собственно комментов).

Andrei- Автор вопроса
Ilya Lakhin
Ну, я вот у себя буквально так и сделал. Я сделал ...

А вот такие вещи как лучше описывать правилами? { some_field = value SomeSubNode {} } Если объявить в качестве токена Id #[define(LOWERCASE_LETTER = ['a'..'z'])] #[define(UPPERCASE_LETTER = ['A'..'Z'])] #[define(LETTER = LOWERCASE_LETTER | UPPERCASE_LETTER)] enum Tokens { #[rule(LETTER+ & ['_']* & LETTER+)] Id, } То some_field и SomeSubNode будут начинаться с Id, а синтаксис не позволяет положить их в разные ноды. Я пошел по пути объявления дополнительного токена CapitalId, который в отличии от Id начинается с UPPERCASE_LETTER, на сколько этот путь соответствует духу lady?

Andrei
А вот такие вещи как лучше описывать правилами? {...

вообще, когда я пытался делать "язык" с максимально простой грамматикой, я ввел кейворды let и call, и присваивание всегда делал через let, чтобы не заморачиваться с вот такими вещами

Andrei
А вот такие вещи как лучше описывать правилами? {...

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

Andrei- Автор вопроса
Rottenfuhrer
вообще, когда я пытался делать "язык" с максимальн...

Конкретно в этом случае не должно быть ни let ни call, ни других ключевых слов вначале ноды. Это особенность этого DSL. За references огромное спасибо, посмотрю как вы с таким работаете.

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта