Some cleanup in the C++ preprocessor.

Introduced pp-scanner.cpp, renamed `pp' to `Preprocessor' and removed useless #includes.
This commit is contained in:
Roberto Raggi
2008-12-22 11:40:53 +01:00
parent d8336257cb
commit 753ddb7ce0
13 changed files with 372 additions and 404 deletions

View File

@@ -50,266 +50,57 @@
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef PP_SCANNER_H
#define PP_SCANNER_H
#ifndef CPLUSPLUS_PP_SCANNER_H
#define CPLUSPLUS_PP_SCANNER_H
namespace CPlusPlus {
struct pp_skip_blanks
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
lines = 0;
for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
if (*__first == '\\')
{
const char *__begin = __first;
++__begin;
if (__begin != __last && *__begin == '\n')
++__first;
else
break;
}
else if (*__first == '\n' || !pp_isspace (*__first))
break;
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_whitespaces
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
lines = 0;
for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
if (! pp_isspace (*__first))
break;
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_comment_or_divop
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
enum {
MAYBE_BEGIN,
BEGIN,
MAYBE_END,
END,
IN_COMMENT,
IN_CXX_COMMENT
} state (MAYBE_BEGIN);
lines = 0;
for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
switch (state)
{
default:
assert (0);
break;
case MAYBE_BEGIN:
if (*__first != '/')
return __first;
state = BEGIN;
break;
case BEGIN:
if (*__first == '*')
state = IN_COMMENT;
else if (*__first == '/')
state = IN_CXX_COMMENT;
else
return __first;
break;
case IN_COMMENT:
if (*__first == '*')
state = MAYBE_END;
break;
case IN_CXX_COMMENT:
if (*__first == '\n')
return __first;
break;
case MAYBE_END:
if (*__first == '/')
state = END;
else if (*__first != '*')
state = IN_COMMENT;
break;
case END:
return __first;
}
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_identifier
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
lines = 0;
for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
if (! pp_isalnum (*__first) && *__first != '_')
break;
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_number
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
lines = 0;
for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
if (! pp_isalnum (*__first) && *__first != '.')
break;
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_string_literal
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
enum {
BEGIN,
IN_STRING,
QUOTE,
END
} state (BEGIN);
lines = 0;
for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
switch (state)
{
default:
assert (0);
break;
case BEGIN:
if (*__first != '\"')
return __first;
state = IN_STRING;
break;
case IN_STRING:
if (! (*__first != '\n'))
return __last;
if (*__first == '\"')
state = END;
else if (*__first == '\\')
state = QUOTE;
break;
case QUOTE:
state = IN_STRING;
break;
case END:
return __first;
}
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_char_literal
{
int lines;
const char *operator () (const char *__first, const char *__last)
{
enum {
BEGIN,
IN_STRING,
QUOTE,
END
} state (BEGIN);
lines = 0;
for (; state != END && __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first)
{
switch (state)
{
default:
assert (0);
break;
case BEGIN:
if (*__first != '\'')
return __first;
state = IN_STRING;
break;
case IN_STRING:
if (! (*__first != '\n'))
return __last;
if (*__first == '\'')
state = END;
else if (*__first == '\\')
state = QUOTE;
break;
case QUOTE:
state = IN_STRING;
break;
}
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
struct pp_skip_argument
@@ -321,60 +112,9 @@ struct pp_skip_argument
pp_skip_comment_or_divop skip_comment_or_divop;
int lines;
const char *operator () (const char *__first, const char *__last)
{
int depth = 0;
lines = 0;
while (__first != __last)
{
if (!depth && (*__first == ')' || *__first == ','))
break;
else if (*__first == '(')
++depth, ++__first;
else if (*__first == ')')
--depth, ++__first;
else if (*__first == '\"')
{
__first = skip_string_literal (__first, __last);
lines += skip_string_literal.lines;
}
else if (*__first == '\'')
{
__first = skip_char_literal (__first, __last);
lines += skip_char_literal.lines;
}
else if (*__first == '/')
{
__first = skip_comment_or_divop (__first, __last);
lines += skip_comment_or_divop.lines;
}
else if (pp_isalpha (*__first) || *__first == '_')
{
__first = skip_identifier (__first, __last);
lines += skip_identifier.lines;
}
else if (pp_isdigit (*__first))
{
__first = skip_number (__first, __last);
lines += skip_number.lines;
}
else if (*__first == '\n')
{
++__first;
++lines;
}
else
++__first;
}
return __first;
}
const char *operator () (const char *first, const char *last);
};
} // namespace CPlusPlus
#endif // PP_SCANNER_H
// kate: space-indent on; indent-width 2; replace-tabs on;
#endif // CPLUSPLUS_PP_SCANNER_H