Чтение ввода и печать специфика c вывод - PullRequest
1 голос
/ 06 февраля 2020

Я sh написать программу на C, которая читает ввод и печатает только определенный вывод (в частности, он пропускает комментарии).

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

Это означает, что эта программа должна правильно обрабатывать триграфы, экранированные кавычки, и другие вещи, которые могут повлиять на комментарии.

Функция игнорирует любые символы комментария при вводе. Например, за исключением ввода внутри строк, он игнорирует весь ввод в форме комментария C (например, ввод между /* и */ и между // и символом новой строки (\n)).

Обратите внимание, что во втором случае печатается символ новой строки, тогда как в первом случае не печатаются ни /*, ни */.

Однако внутри строки (например, "hello //world") программа напечатает все, что следует после спецификаторов комментария (в этом случае будет напечатано "hello //world", даже если «миру» предшествует одиночный строка C - спецификатор комментария).

До сих пор я пытался рассмотреть несколько случаев. Я рассмотрел определение двух переменных sngl_line и multi_line, чтобы определить, когда ввод находится между a // и \ n (т. Е. Sngl_line имеет значение true) или когда ввод находится между /* и */ (т. Е. Multi_line является правда). Я написал программу, которая игнорирует комментарии вне строк, но я считаю, что иметь дело с триграфами особенно проблематично c. Возможно, мне следует разобраться с ними позже?

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

1 Ответ

1 голос
/ 06 февраля 2020

Использование конечного автомата

Обработка ввода, как если бы вы находились в одном из следующих состояний:

  1. Нормальный
  2. Внутри ""
  3. Внутри ''
  4. Внутри / / * / комментария
  5. Внутри // комментария в конце строки

От В каждом состоянии есть несколько правил перехода в другое состояние.

Например, из // состояния комментария оставайтесь там до конца строки, затем go до нормы.
из нормально , если следующие символы //, перейти к состоянию комментария //.
С normal , если следующие символы /*, перейти к состоянию комментария / *.

Это действительно очень полезная задача программирования, поэтому я не буду перечислять больше.


Похоже, что данные OP не находятся в состоянии ''.

...