Добавление отступа - PullRequest
0 голосов
/ 22 августа 2010

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

Такие вещи, как ...

STARTMAIN a=b+2; return a ENDMAIN

... должно стать ...

int main () { a=b+2; return a; }

Пока все хорошо, почти. В упражнении также требуется, чтобы в то же время, когда мы обращаемся, мы добавляли правильные отступы и (как мне пришлось выучить трудный путь в прошлом году) переводы строк.

Очевидная часть заключается в том, что каждый раз, когда открывается {, вы увеличиваете счетчик, а затем добавляете соответствующие вкладки в каждой новой строке. Однако закрывающие скобки ('}') - это отдельная история, так как вы не можете обнаружить их заранее, и, проанализировав их, вы не можете просто поместить их вкладку влево, удалив последнюю напечатанную вкладку.

Есть ли решение для этого и / или последовательный способ проверки и добавления отступов?

1 Ответ

2 голосов
/ 22 августа 2010

Итак, вы обнаружили одну причину, по которой люди не всегда стараются аккуратно форматировать сгенерированный вывод; это сделать относительно сложно.

Действительно, один из способов решения этой проблемы - предоставить официальный форматер для языка. Язык программирования Go от Google поставляется с программой 'gofmt' для поддержки официального формата. C не имеет такого стандарта, следовательно, религиозные войны за размещение фигурных скобок, но у него есть такие программы, как indent, которые на самом деле могут аккуратно отформатировать код для вас.

Хитрость в том, чтобы ничего не выводить в строку, пока вы не знаете, сколько вкладок вывести. Таким образом, в строке с закрывающей скобкой вы уменьшаете счетчик отступов (следя за тем, чтобы он никогда не становился отрицательным), и только после этого выводите ведущие вкладки и следующую скобку.

Обратите внимание, что некоторые части C требуют точку с запятой (или запятую) после закрывающей скобки (подумайте об инициализаторах и определениях структуры); другие этого не делают (подумайте о блоках операторов).

...