LINUX.ORG.RU

Неоднозначный парсинг C++-кода

 ,


0

2

Ни для кого не секрет, что C++ обладает контекстно-зависимой грамматикой, т.е. для куска кода возможны несколько различных AST. Например, в следующем коде две синтаксически одинаковые строки обладают совершенно разной семантикой.

template <int n> void f(int m)
{
    return;
}

int main()
{
    int s = 123;
    int k = 1234;

    f<11>(k);
    s<11>(k);

    return 0;
}

Однако, для каждой из этих строк валидным является только один вариант AST: вызов функции в первом случае, сравнение во втором.

Мой вопрос вот в чём: возможно ли написать код на C++ таким образом, чтобы для него было больше одного валидного варианта парсинга?

Ответ на: комментарий от tailgunner

Ищешь zero-day в спеке Си++?

Нет, просто праздное любопытство.

[сторонник легализации героина]

Ты так говоришь как будто это что-то плохое.

hateyoufeel ★★★★★
() автор топика

И если бы еще при этом компиляторы поступали каждый по-своему. Это было бы очень плохо, я думаю.

hibou ★★★★★
()
Ответ на: не совсем, но от mix_mix

Например, T::iterator * iter;

Типа умножение или объявление переменной в зависимости от того, чем является T::iterator: переменной или типом? В итоге валидным будет только один вариант, как и в моём примере.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

Нет, компилятор не знает что ты имел в виду, это одинаково валидные варианты, и без typename, который придумали специально по этой причине будет ошибка вида

1.cpp:4:19: error: use of undeclared identifier 'iter'
    T::iterator * iter;

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Ок, но там, опять же, всё довольно однозначно.

http://pages.cs.wisc.edu/~driscoll/typename.html

Without typename, there is a C++ parsing rule that says that qualified dependent names should be parsed as non-types even if it leads to a syntax error.

typename добавили, чтобы была возможность писать подобный код вообще, а не потому что была какая-то неоднозначность, как я понял.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Ну так без typename была бы неоднозначность, поэтому его и добавили. Это наталкивает на мысль, что на данный момент в языке нет неоднозначностей, иначе бы давно ввели ещё несколько уродливых костылей для их устранения.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Ну так без typename была бы неоднозначность

В чём именно? Без typename это вполне однозначно парсилось как умножение, как я понял.

на данный момент в языке нет неоднозначностей, иначе бы давно ввели ещё несколько уродливых костылей для их устранения.

Известных неоднозначностей. Я не помню, чтобы кто-то пытался это доказать, отсюда и возник вопрос :)

hateyoufeel ★★★★★
() автор топика

Ни для кого не секрет, что C++ обладает контекстно-зависимой грамматикой, т.е. для куска кода возможны несколько различных AST.

Это не кз-грамматика. В кз-грамматиках, наоборот, для одного АСТ возможно несколько вариантов кода. А когда для одного куска кода есть много АСТ - это обычная кс-грамматика.

anonymous
()
Ответ на: комментарий от Begemoth

Нет, там тоже всё весьма однозначно.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Есть похожее со словом template, как раз такой случай.

template<int N>
struct A {
    template<int M> void f(int _) {}
};
int k;
A<1>().f<1>(k); // сравнение
A<1>().template f<1>(k); // вызов функции
    

vzzo ★★★
()
Ответ на: комментарий от vzzo

В данном случае, конечно, не 1, а A<K> в какой-нибудь другой структуре.

vzzo ★★★
()

Маленький вопрос: зачем пытаться писать такие языковые конструкции, которые могу себя повести непредсказуемым образом?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от vzzo

Нифига подобного, кстати. И то и другое - вызов метода. Или я нифига не понял что ты имел ввиду.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

зачем пытаться писать такие языковые конструкции, которые могу себя повести непредсказуемым образом?

Ахах. Пыхеры с мозолями на лбу, например, никогда не выпускают эту мысль из головы ))

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Да пожалуйста. Дебажить то всеравно тебе.

Нет. Дебажить это никто вообще не будет, потому что ни в какой реальный проект этот код всё равно не попадёт. Всё делается исключительно ради лулзов и удовлетворения собственного любопытства.

hateyoufeel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.