Каковы правила разбора выражений в C?

Как я могу понять разбор таких выражений, как

a = b+++++b---c--;

in C?

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


person Moeb    schedule 23.10.2010    source источник
comment
@Martin: если вы можете удалить 6.2/4 из стандарта C, кого это волнует, то вы можете закрыть этот вопрос, кого это волнует ;-p Примеры Daft могут проиллюстрировать основы.   -  person Steve Jessop    schedule 25.10.2010


Ответы (3)


Из стандарта 6.2(4):

Если входной поток был проанализирован на токены предварительной обработки до заданного символа, следующий токен предварительной обработки представляет собой самую длинную последовательность символов, которая может составлять токен предварительной обработки.

Они даже добавляют пример:

ПРИМЕР 2 Фрагмент программы x++++y анализируется как x ++ ++ + y, что нарушает ограничение на операторы приращения, хотя анализ x ++ + ++ y может дать правильное выражение.

Итак, ваше утверждение:

a = b+++++b---c--; 

Эквивалентно:

a = b ++ ++ + b -- - c -- ;
person Dingo    schedule 23.10.2010
comment
Это лексика. В зависимости от того, что спрашивающий имеет в виду под синтаксическим анализом, вам также необходимо использовать правила приоритета операторов для построения дерева выражений. - person Steve Jessop; 23.10.2010
comment
2.1.1.2 Фазы трансляции 7. [...] Токены предварительной обработки преобразуются в токены. [...] flash-gordon.me.uk/ansi.c.txt - person starblue; 23.10.2010
comment
Учитывая отсутствие пробелов, я предполагаю, что он имеет в виду разбор на токены. Во всяком случае, для его примера нет действительного дерева выражений. - person Dingo; 23.10.2010
comment
Я предполагаю, что он имеет в виду разбор на токены. Да, это то, что я имел в виду. - person Moeb; 28.10.2010

Участвуют операторы ++, --, + и -. Здесь помогут скобки и пробелы:

a = ((b++)++) + (b--) - (c--);

Я не знаю, как именно работает синтаксический анализ, но нет двусмысленности (хорошо, есть, см. ответ Динго), поэтому я думаю, что это можно сделать с помощью некоторых простых правил, таких как:

  • Один или несколько символов составляют имя переменной, самый простой тип «выражения».
  • Операторы + и - объединяют два "выражения"
  • Операторы ++ и -- являются суффиксом к «выражению».

Чтобы устранить двусмысленность, вы можете дать ++ и -- более высокий приоритет, чем + и -.

person schnaader    schedule 23.10.2010

Я знаю, насколько вы знакомы с парсерами, так что на всякий случай: http://en.wikipedia.org/wiki/LL_parser

Если вам нужно формальное описание грамматики, взгляните на описание генератора парсеров: https://javacc.dev.java.net/servlets/ProjectDocumentList?folderID=110

person ika    schedule 23.10.2010