这一部分逻辑在PostMasterMain比较早的地方进行的,初始化完内存内存上下文,初始化玩GUCoption,解析完入参,就开始解析配置文件了。 ParseConfigFile这个函数位于src/backend/utils/misc/guc-file.c中,这个guc-file.c很有意思,代码看的莫名其妙。刚开始看GUC_yylex看的我一头雾水,不知所云,代码跟踪到yylex跟踪不下去了。后来发现目录下还有一个guc-file.l的文件。我就差不多想到了这肯定与传说中的yacc and lex有关系。 我首先翻看了Makefile,找到了如下code:
guc-file.c: guc-file.l
ifdef FLEX
$(FLEX) $(FLEXFLAGS)-o'$@' $<
else
@$(missing) flex $< $@
endif
果然,guc-file.c是flex从guc-file.l中生成的。这就需要了解传说中的yacc and lex 以及传说中的flex and bison了。 flex,全称是Fast Lexical Analyzer Generator。前身是lex。历史就比较有趣了,Eric Schmidt在1975年写了一个工具lex,这个工具被看作是yacc的兄弟,很有名气,尽管有点慢,而且bug有点多。1987年Vern Paxson写了flex,这个flex就比较好了,比较快,又可靠。值得一提的是Eric Schmidt,这个名字很熟悉吧,这是Google的执行主席。一起膜拜下大牛:
guc-file.l里面的解析稍微有点复杂,不利于我们入门。我找了Flex and bison这本书,练习了第一章的例子,算是基本入了门。 这个例子就如同Linux下的wc工具。我们看下代码: