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

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

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

19 ответов

16 просмотров

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

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

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта