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

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

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

19 ответов

21 просмотр

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

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 огромное спасибо, посмотрю как вы с таким работаете.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта