Size: a a a

Compiler Development

2020 January 21

VY

Vasiliy Yorkin in Compiler Development
что парсер не может влиять на лексер (в случае руби)
источник

AT

Alexander Tchitchigin in Compiler Development
Vasiliy Yorkin
> в котором парсер может влиять на лексер

Там yacc и lex
https://github.com/ruby/ruby/blob/master/lex.c.blt
https://github.com/ruby/ruby/blob/master/parse.y

Не уверен на 100%, но могу предположить, что нет
Имеет смысл сначала пробежаться по коду, который Вы скинули, а потом уже строить предположения. 😉
@KvanTTT замолчал тот факт, что мы уже посмотрели на эти исходники и нашли запутанные места. И именно поэтому просим совета у тех, кто разобрался лучше нас.
источник

IK

Ivan Kochurkin in Compiler Development
Просто в парсере есть макрос SET_LEX_STATE, который в теории влияет на лексинг. Но не знаю, насколько это актуально и какие режими он в точности переключает.
источник

AT

Alexander Tchitchigin in Compiler Development
Видимо, нужно в чате про Ruby спрашивать. Но соваться туда страшновато... 😂
источник

VY

Vasiliy Yorkin in Compiler Development
бтв есть книжка под названием ruby under microscope, мб там можно что-то найти в первых главах. там как раз про лексер и парсер его. да, каюсь, код особенно не читал, просто что-то вспомнил из этой книжки и сделал такое предположение
источник

IK

Ivan Kochurkin in Compiler Development
Alexander Tchitchigin
Видимо, нужно в чате про Ruby спрашивать. Но соваться туда страшновато... 😂
Это почему? 😄
источник

AT

Alexander Tchitchigin in Compiler Development
Ivan Kochurkin
Это почему? 😄
Заклюют! 😂
источник

AT

Alexander Tchitchigin in Compiler Development
Нет, просто не думаю, что Ruby-разработчики сильно в курсе тонкостей лексинга и парсинга.
источник

VY

Vasiliy Yorkin in Compiler Development
#define SET_LEX_STATE(ls) \
   (p->lex.state = \
    (p->debug ? \
     rb_parser_trace_lex_state(p, p->lex.state, (ls), __LINE__) : \
     (enum lex_state_e)(ls)))

Кажется, этот макрос просто трейсит состояние лексера
https://github.com/ruby/ruby/blob/019a0ed0c78ccd0eb694d09c6a226761261ec15d/parse.y#L10278
источник

AT

Alexander Tchitchigin in Compiler Development
Vasiliy Yorkin
#define SET_LEX_STATE(ls) \
   (p->lex.state = \
    (p->debug ? \
     rb_parser_trace_lex_state(p, p->lex.state, (ls), __LINE__) : \
     (enum lex_state_e)(ls)))

Кажется, этот макрос просто трейсит состояние лексера
https://github.com/ruby/ruby/blob/019a0ed0c78ccd0eb694d09c6a226761261ec15d/parse.y#L10278
(enum lex_state_e)(ls) ни на что не намекает? 😉
источник

AK

Andrei Kurosh in Compiler Development
AFAIK синтаксис у Ruby довольно простой - это стандартная библиотека разухабистая
источник

VY

Vasiliy Yorkin in Compiler Development
Alexander Tchitchigin
(enum lex_state_e)(ls) ни на что не намекает? 😉
Просто возвращает enum lex_state_e обратно?
В если debug, то трейсит, иначе ничего не делает
источник

AT

Alexander Tchitchigin in Compiler Development
Vasiliy Yorkin
Просто возвращает enum lex_state_e обратно?
В если debug, то трейсит, иначе ничего не делает
(p->lex.state = 😉
источник

AT

Alexander Tchitchigin in Compiler Development
Складываем 2 и 2, и получаем... 😉
источник

VY

Vasiliy Yorkin in Compiler Development
Vasiliy Yorkin
что парсер не может влиять на лексер (в случае руби)
Судя по всему на этот lex.state смотрит только сам parser.y (в местах, где используется IS_lex_state, типа https://github.com/ruby/ruby/blob/c5eb24349a/parse.y#L9228)
источник

VY

Vasiliy Yorkin in Compiler Development
Интересно, тут "commute" значит "коммутируют" в том смысле, что s (некий потенциально side-effectful statement) можно выполнить до\после e? (стр. 175 tiger-book)
источник

VY

Vasiliy Yorkin in Compiler Development
Судя по этой пикче и вот этому объяснению:
источник

VY

Vasiliy Yorkin in Compiler Development
Т.е. если их этот statement и expression можно переставить, то я могу выполнить следующее преобразование, например:
BinOp(Const n, op, ESeq(s, e)) = ESeq(s, BinOp(Const n, op, e))


Соответственно, вместо Const n могло бы быть Name l, или вместо ESeq(...) могло бы быть Seq(Const _)
источник

BD

Berkus Decker in Compiler Development
commute это перестановка насколько я понимаю, то есть “взаимозаменяемы"
источник

SE

Stanislav Ershov in Compiler Development
о, @berkus нихао
источник