vak: (Default)
[personal profile] vak
Вожусь с парсером для Си компилятора. Обнаруживаю кое-что неожиданное в языке. Как вы думаете, как должен парсер интерпретировать конструкцию вида:
foo = (bar)
Нет вопросов! - воскликнет наивный читатель. 😀 В языке Би действительно это всегда было вычисление выражения bar, взятого в скобки. Однако Си не так прост.

Всё зависит от смысла bar. Если bar определён как переменная:
int bar;
то это действительно будет вычисление значения bar и присваивание в foo. Или даже как массив int bar[] или как функция int bar(). То же самое, но уже не значение а адрес. Всё ожидаемо.

Но представим, что bar определено как тип:
typedef int bar;
Тогда конструкция превращается в приведение типа, и парсер должен ожидать дальше некое значение, например:
foo = (bar) 42;

Однако и это ещё не всё. Может оказаться, что bar определено как агрегатный тип, то есть массив или структура:
typedef int bar[];
Тогда конструкция превращается в составной литерал, и парсер должен ожидать дальше фигурные скобки со списком значений:
foo = (bar) { 42, 56, 72 };

А вы говорите: контекстно свободные грамматики. Свобода нам только снится. 😀

Date: 2025-05-11 20:08 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Ой бля.
Ну да в реале-то си не то чтобы так уж КС. Местами.

Date: 2025-05-11 21:17 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Парсер должен видеть что-то типа
ident_sy("foo") = oparen_sy ident_sy("bar") cparen_sy

или
ident_sy("foo") = oparen_sy type_sy("bar") cparen_sy

или
ident_sy("foo") = oparen_sy aggrtype_sy("bar") cparen_sy


А уж как под руководством парсера, таким образом, НЯП, контекстно-свободного, по ходу дела модифицируется сканер - это отдельный вопрос.

Date: 2025-05-12 03:36 (UTC)
x86128: (Default)
From: [personal profile] x86128
нынче народ совсем гошкой стал разбалован, мозг о такие контекстно свободные фокусы ломается :)