Size: a a a

Compiler Development

2020 July 09

MS

Mikola Summer Duck in Compiler Development
…вмонтированный или в структуру, или в указатель на неё.
источник

IK

Ivan Kochurkin in Compiler Development
fldlg2
Если в ANTLR при этом выключен backtracking, то почему бы и нет. Если включен, то без parse tree, как я понимаю, придётся проходить один и тот же путь несколько раз.
Это вряд ли - бектрекинг не учитывает построенное дерево, а вызывает функцию генерации после окончательного парсинга.
источник

f

fldlg2 in Compiler Development
Ivan Kochurkin
Это вряд ли - бектрекинг не учитывает построенное дерево, а вызывает функцию генерации после окончательного парсинга.
Жаль, я надеялся, что ANTLR умеет мемоизировать, как packrat.
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
ну хорошо, что компилятор должен сгенерить для такого кейса
x(rand()  >  0.5 ? new Foo() : new Bar() )
A *ptr;
if (rand() > 0.5) {
 Foo *tmp = new Foo();
 ptr = (A *)( (char *)tmp + A_offset_in_Foo );
} else {
 Bar *tmp = new Bar();
 ptr = (A *)( (char *)tmp + A_offset_in_Bar );
}
x(ptr);

Примерно такой.
источник

IK

Ivan Kochurkin in Compiler Development
Так он умеет мемоизировать, речь шла о конечном дереве разбора.
источник

IK

Ivan Kochurkin in Compiler Development
fldlg2
Так ведь изначальный вопрос был — что может top-down, чего не может bottom-up, а не наоборот? 😉
Походу если сравнивать в общем LL(*) и LR, то они заменяемы. А вот с частными случаями все сложнее: https://cs.stackexchange.com/a/48/47361
источник

f

fldlg2 in Compiler Development
Ivan Kochurkin
Так он умеет мемоизировать, речь шла о конечном дереве разбора.
Выше я специально упомянул "промежуточное parse tree", а не конечное.
источник

f

fldlg2 in Compiler Development
LL(k)-грамматики являются подмножеством LR(k)-грамматик, но не наоборот.
источник

c

cevek in Compiler Development
Alexander Tchitchigin
A *ptr;
if (rand() > 0.5) {
 Foo *tmp = new Foo();
 ptr = (A *)( (char *)tmp + A_offset_in_Foo );
} else {
 Bar *tmp = new Bar();
 ptr = (A *)( (char *)tmp + A_offset_in_Bar );
}
x(ptr);

Примерно такой.
ок с этим понятно, спасибо
а что если функция принимает 2 обязательных интерфейса как в расте
x(A + B g)
источник

f

fldlg2 in Compiler Development
@KvanTTT Наверное, когда выясняют, кто является подмножеством кого, имеют в виду левую рекурсию.
источник

IK

Ivan Kochurkin in Compiler Development
fldlg2
LL(k)-грамматики являются подмножеством LR(k)-грамматик, но не наоборот.
LL(k) и LL(*) - это разные вещи. Первые являются подмножеством, вторые - нет.
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
ок с этим понятно, спасибо
а что если функция принимает 2 обязательных интерфейса как в расте
x(A + B g)
А в Rust и Haskell виртуальные таблицы передаются отдельными аргументами и мы, соответственно, можем передать их сколько хотим.
источник

IK

Ivan Kochurkin in Compiler Development
Написано: LL(∗)×LR  (left recursion versus arbitrary lookahead)
источник

c

cevek in Compiler Development
Alexander Tchitchigin
А в Rust и Haskell виртуальные таблицы передаются отдельными аргументами и мы, соответственно, можем передать их сколько хотим.
т е  примерно так да
x(A g1, B g2)
источник

f

fldlg2 in Compiler Development
Ivan Kochurkin
Написано: LL(∗)×LR  (left recursion versus arbitrary lookahead)
Хорошо, LL(∞) не являются подмножеством LR(k), т.к. LR(∞) практически неосуществима 😊
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
т е  примерно так да
x(A g1, B g2)
Примерно x(A tblA, B tblB, SomeStruct g).
источник

f

fldlg2 in Compiler Development
@val_krylov ^ кажется, мы нашли случай, где LL круче, чем LR 😉
источник

c

cevek in Compiler Development
@GabrielFallen а в чем тогда проблема что работать с полями в интерфейсах если в функцию нам приходит конкретное смещение для этого интерфейса? нам ведь ничего не мешает прочитать и записать в конкретное поле что нибудь
источник

AT

Alexander Tchitchigi... in Compiler Development
cevek
@GabrielFallen а в чем тогда проблема что работать с полями в интерфейсах если в функцию нам приходит конкретное смещение для этого интерфейса? нам ведь ничего не мешает прочитать и записать в конкретное поле что нибудь
То, что поле одно на весь объект, а интерфейсов может быть много. Добро пожаловать в dimond inheritance problem — можете на Википедии почитать про эту шизофрению.
источник

AT

Alexander Tchitchigi... in Compiler Development
Ещё раз повторю, что поля понимаются как реальные поля объекта, а не "проперти" или ещё какая-нибудь скрытая форма функций.
источник