看来我的知识老化了。在我上学的那个时期,gcc还使用yacc生成解析器,所以肯定是LR解析器没问题,不过刚看了一下gcc 7.2的源码,其解析器gcc7.2.0\gcc\cp\parser.c(一个1.2MB的恐怖C源码)里面明确说了“The parser is of the standard recursive-descent variety”,应该是某种LL解析器,而不是LR。继续搜索了一下,发现gcc从2004年10月开始就使用了新的语法解析器,不再使用yacc自动生成,继续搜索,发现clang也使用的LL解析器,也许现在主要语言都不使用LR解析器了,我感觉学过的编译原理已经过时了...
因为CB项目里可以直接使用Delphi单元,所以必须也能提示Delphi语法的东西,就使用一样的技术了。静态实现是基于知识库+源代码扫描,实质就是文本搜索,动态实现除了文本搜索,还有语法扫描,能实时检查出语法错误,所以敲代码的时候有时在IDE下方的消息窗口中会出现Unable to invoke Code Completion due to errors in source code,另外即便没有源码,动态实现也能从.lib、.obj、.dcu得到信息。