示例#1
0
文件: cpp.c 项目: deglingo/dokidoc
/* _parse_directive:
 */
static void _parse_directive ( CPP *cpp )
{
  Token *tok;
  DokLocation loc = { 0, };
  /* skip whites */
  do {
    tok = lexer_lex(cpp->lexer, &loc);
  } while (tok->type == TOK_SPACE);
  ASSERT(tok->type == TOK_IDENT);
  if (!strcmp(tok->value, "include"))
    {
      /* [FIXME] */
      tok = lexer_lex_include(cpp->lexer, &loc);
      ASSERT(tok->type == TOK_INCLUDE);
      CL_DEBUG("include: '%s'", tok->value);
      do {
        tok = lexer_lex(cpp->lexer, &loc);
        ASSERT(tok->type == TOK_NL || tok->type == TOK_COMMENT);
      } while (tok->type != TOK_NL);
    }
  else
    {
      CL_DEBUG("[TODO] unknown directive: '%s'", tok->value);
      do {
        tok = lexer_lex(cpp->lexer, &loc);
      } while (tok->type != TOK_NL);
    }
}
示例#2
0
文件: cpp.c 项目: deglingo/dokidoc
/* cpp_lex:
 */
Token *cpp_lex ( CPP *cpp,
                 DokLocation *loc )
{
  Token *tok;
  if (cpp->unlex_token)
    {
      tok = cpp->unlex_token;
      *loc = cpp->unlex_loc;
      cpp->unlex_token = NULL;
      return tok;
    }
  while (1)
    {
      if (!(tok = lexer_lex(cpp->lexer, loc)))
        return NULL;
      switch (tok->type)
        {
        case TOK_COMMENT:
          return tok;
        case TOK_SHARP:
          /* [FIXME] check BOL */
          _parse_directive(cpp);
          continue;
        case TOK_NL:
        case TOK_SPACE:
          continue; /* [fixme] */
        case TOK_IDENT:
          /* [FIXME] expansion */
          if (!strcmp(tok->value, "G_GNUC_NULL_TERMINATED"))
            continue;
          else
            return tok;
        default:
          return tok;
        }
    }
}
示例#3
0
/*
 *  Command-line front end for compiler.
 */
int main(int argc, char **argv)
{
	int action;

	int arg;

	buffer_t *in_buffer;
	buffer_t *out_buffer;

	int is_done;
	parser_t *parser;
	lexer_t *lexer;
	token_t *token;


	/* Set default settings. */
	action = ACT_TRANS;
	in_buffer = buffer_create(stdin);
	out_buffer = buffer_create(stdout);

	/* Parse command-line arguments. */
	for (arg = 1; arg < argc; arg++)
	{
		if ((strcmp(argv[arg], "--help") == 0)
			|| (strcmp(argv[arg], "-h") == 0))
		{
			action = ACT_USAGE;
		}
		else if ((strcmp(argv[arg], "--lex") == 0) && (action <= ACT_LEX))
		{
			action = ACT_LEX;
		}
		else if ((strcmp(argv[arg], "--parse") == 0) && (action <= ACT_PARSE))
		{
			action = ACT_PARSE;
		}
		else if ((strcmp(argv[arg], "--translate") == 0)
			&& (action <= ACT_TRANS))
		{
			action = ACT_TRANS;
		}
		else
		{
			fprintf(stderr, "Invalid argument: %s\n", argv[arg]);
			/* Stop parsing command-line. */
			arg = argc;

			action = ACT_USAGE;
		}
	}

	/* Take action. */
	if (action == ACT_USAGE)
	{
		printf(
			"Usage: compiler [option...]\n"
			"\n"
			"  Options:\n"
			"\n"
			"  -h, --help       Display this help text.\n"
			"      --lex        Run the lexer.\n"
			"      --parse      Run the parser. (Calls the lexer.)\n"
			"      --translate  Run the translator. (Calls the parser.)\n"
		);
	}
	else if (action == ACT_LEX)
	{
		is_done = 0;
		lexer = lexer_create(in_buffer);
		token = token_create();

		while (!is_done)
		{
			lexer_lex(lexer, token);
			token_print(token, stdout);
			printf("\n");
			if (token_get_class(token) == T_EOF)
				is_done = 1;
		}

		token_destroy(token);
		lexer_destroy(lexer);

		return EXIT_SUCCESS;
	}
	else if (action == ACT_PARSE)
	{
		parser = parser_create(in_buffer);

		parser_parse(parser);

		parser_destroy(parser);

		return EXIT_SUCCESS;
	}
	else if (action == ACT_TRANS)
	{
		parser = parser_create(in_buffer);

		parser_parse(parser);
		translator_translate(parser_get_tree(parser));

		parser_destroy(parser);

		return EXIT_SUCCESS;
	}

	return EXIT_SUCCESS;
}