thrift的编译器2

原创 2012年03月24日 11:07:06

    main函数中调用了两个非常重要的函数,parse()和generate(),parse()解析thrift文件,生产语法树,即全局变量g_program。generate()通过这棵语法树,生产具体的语言代码。具体看看这两个函数。thrift的词法解析和语法解析用了flex和bison。

void parse(t_program* program, t_program* parent_program) {
  // Get scope file path 获取thrift文件的路径
  string path = program->get_path();

  // Set current dir global, which is used in the include_file function
  g_curdir = directory_name(path);
  g_curpath = path;

  // Open the file
  yyin = fopen(path.c_str(), "r");
  if (yyin == 0) {
    failure("Could not open input file: \"%s\"", path.c_str());
  }

  // Create new scope and scan for includes
  // 进行第一次yyparse,找出所有的include文件。
  pverbose("Scanning %s for includes\n", path.c_str());
  g_parse_mode = INCLUDES;
  g_program = program;
  g_scope = program->scope();
  try {
    yylineno = 1;
    if (yyparse() != 0) {
      failure("Parser error during include pass.");
    }
  } catch (string x) {
    failure(x.c_str());
  }
  fclose(yyin);

  // Recursively parse all the include programs
  vector<t_program*>& includes = program->get_includes();
  vector<t_program*>::iterator iter;
  for (iter = includes.begin(); iter != includes.end(); ++iter) {
    parse(*iter, program);
  }

  // Parse the program file
  // 第二次yyparse,生成语法树
  g_parse_mode = PROGRAM;
  g_program = program;
  g_scope = program->scope();
  g_parent_scope = (parent_program != NULL) ? parent_program->scope() : NULL;
  g_parent_prefix = program->get_name() + ".";
  g_curpath = path;
  yyin = fopen(path.c_str(), "r");
  if (yyin == 0) {
    failure("Could not open input file: \"%s\"", path.c_str());
  }
  pverbose("Parsing %s for types\n", path.c_str());
  yylineno = 1;
  try {
    if (yyparse() != 0) {
      failure("Parser error during types pass.");
    }
  } catch (string x) {
    failure(x.c_str());
  }
  fclose(yyin);
}



void generate(t_program* program, const vector<string>& generator_strings) {
  // Oooohh, recursive code generation, hot!!
  // 是否递归的生成include文件的代码
  if (gen_recurse) {
    const vector<t_program*>& includes = program->get_includes();
    for (size_t i = 0; i < includes.size(); ++i) {
      // Propogate output path from parent to child programs
      includes[i]->set_out_path(program->get_out_path(), program->is_out_path_absolute());

      generate(includes[i], generator_strings);
    }
  }

  // Generate code!
  try {
    pverbose("Program: %s\n", program->get_path().c_str());

    // Compute fingerprints.
    generate_all_fingerprints(program);

    if (dump_docs) {
      dump_docstrings(program);
    }

    //  循环生成不同语言的代码
    vector<string>::const_iterator iter;
    for (iter = generator_strings.begin(); iter != generator_strings.end(); ++iter) {
      t_generator* generator = t_generator_registry::get_generator(program, *iter);

      if (generator == NULL) {
        pwarning(1, "Unable to get a generator for \"%s\".\n", iter->c_str());
      } else {
        pverbose("Generating \"%s\"\n", iter->c_str());
        generator->generate_program();  // 不同语言实现不同的函数。
        delete generator;
      }
    }

  } catch (string s) {
    printf("Error: %s\n", s.c_str());
  } catch (const char* exc) {
    printf("Error: %s\n", exc);
  }

}




                    

相关文章推荐

Thrift之代码生成器Compiler原理及源码详细解析1

我的新浪微博:http://weibo.com/freshairbrucewoo。 欢迎大家相互交流,共同提高技术。 又很久没有写博客了,最近忙着研究GlusterFS,本来周末打算写几篇...

Thrift编译库(编译器VS2010+SP1)

  • 2014年09月19日 15:39
  • 18.07MB
  • 下载

thrift的编译器(1)

thrift的编译器作用是把thrift文件编译成各种目标语言的代码,编译器的代码目录在thrift-0.8.0/compiler/cpp/src/下。     main函数一开始解析各种参数,主要...
  • albani
  • albani
  • 2012年03月03日 23:07
  • 1261

java代码使用thrift2操作hbase示例

  • 2017年11月16日 11:49
  • 2.62MB
  • 下载

golang connect hbase thrift2

  • 2017年03月21日 16:39
  • 919KB
  • 下载

python使用thrift2协议connect hbase

搜索了一下,网上大多都是使用thrift1来链接hbase的,其实,现在线上大多使用的都是thrift2协议,那么到底python使用thrift2怎样连接hbase呢? 下面是具体步骤...
  • lesorb
  • lesorb
  • 2015年08月14日 11:35
  • 4282

C#使用Thrift2操作HBase数据库

  • 2017年01月22日 09:00
  • 1.49MB
  • 下载

python thrift2 connect hbase

  • 2015年08月14日 10:45
  • 75KB
  • 下载

架构设计:系统间通信(14)——RPC实例Apache Thrift 下篇(2)

为了更深入理解服务治理框架的作用、工作原理,下面我们就以Apache Thrift为服务治理框架基础技术,来实现一个简单的服务治理框架。为了保证快速实现,我们使用zookeeper作为服务管理组件的基...

thrift和avro研究资料2

  • 2013年06月19日 15:30
  • 40MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:thrift的编译器2
举报原因:
原因补充:

(最多只允许输入30个字)