Каковы правила синтаксического анализа для выражений в C? - PullRequest
4 голосов
/ 23 октября 2010

Как понять синтаксический анализ выражений типа

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

в С?

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

Ответы [ 3 ]

5 голосов
/ 23 октября 2010

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

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

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

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

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

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

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

a = b ++ ++ + b -- - c -- ;
2 голосов
/ 23 октября 2010

В число участвующих операторов входят ++, --, + и -. Некоторые паратезы и пробелы помогут здесь:

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

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

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

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

1 голос
/ 23 октября 2010

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

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

...