Это хак, но препроцессор C ++ удаляет комментарии, так что вы можете просто вызвать его перед анализом определений.Для gcc это g++ -E input.cpp
.Препроцессор gcc оставит после обработки комментарии, с которыми вам придется иметь дело, но с ними гораздо проще работать, чем с комментариями в целом.
@ NathanOliver написал в комментариях:
Прочитайте всю строку, а затем работайте в обратном направлении, пока не нажмете;
Если вы знаете всех васдолжны иметь дело с объявлениями функций и комментариями, это, вероятно, самый простой и простой вариант.
Если вы хотите что-то более серьезное (т. е. реальный формат на самом деле может быть более сложным), то правильная абстракция - это посмотретьна это как серия жетонов.Вам придется взглянуть на первые несколько глав любой хорошей книги компиляторов для полного изложения, но если мы можем предположить, что ваш файл имеет только объявления и комментарии, вот простой способ начать.
ТамВот четыре категории токенов, которые вас интересуют: пробелы, комментарии, код и точка с запятой.По первым двум символам вы можете определить, какой из них у вас есть.
Например, если это ваш ввод:
a=f(b,
c); //comment
d=f(e,f);
Тогда мы бы хотели разбить это на
a=f(b, // Code
\n // Whitespace
c) // Code
; // Semicolon
// Whitespace
//comment\n //Comment
d=f(e,f) // Code
; // Semicolon
(Возможны и другие способы его разбить. Например, ["a=f(b,", "c)", ";", "d=f(e,f)", ";"]
и просто пропустить некодовые вещи.)
Вы можете написать функцию, которая будет проходить символ за символом и возвращатьсамый большой кусок текста в этой категории вы можете найти.Тогда ваш «парсер» может просто несколько раз вызывать это, отбрасывать комментарии и пробелы и объединять объявления.Такие инструменты, как lex
, могут сделать это за вас, хотя в этом случае, вероятно, так же легко освоить lex, как и самостоятельно.