+ case '#':
+ token = lex_token(file); /* skip '#' */
+ while (isspace(token)) {
+ if (token == '\n')
+ return error(ERROR_PARSE, "Expected valid preprocessor directive after `#` %s\n");
+ token = lex_token(file); /* try again */
+ }
+ /*
+ * If we make it here we found a directive, the supported
+ * directives so far are #include.
+ */
+ if (strncmp(file->lastok, "include", sizeof("include")) == 0) {
+ /*
+ * We only suport include " ", not <> like in C (why?)
+ * because the latter is silly.
+ */
+ while (*file->lastok != '"' && token != '\n')
+ token = lex_token(file);
+
+ /* we handle lexing at that point now */
+ if (token == '\n')
+ return error(ERROR_PARSE, "%d: Invalid use of include preprocessor directive: wanted #include \"file.h\"\n", file->line);
+ }
+
+ /* skip all tokens to end of directive */
+ while (token != '\n')
+ token = lex_token(file);
+ break;
+
+ case '.':
+ PARSE_TREE_ADD(PARSE_TYPE_DOT);
+ break;
+ case '(':
+ PARSE_TREE_ADD(PARSE_TYPE_LPARTH);
+ break;
+ case ')':
+ PARSE_TREE_ADD(PARSE_TYPE_RPARTH);
+ break;
+
+ case '&': /* & */