我的目标是制作一个程序(使用C++),它将C源代码作为输入并检查"SYNTAX ERRORS ONLY"
。继续C语法分析器相关项目的混乱
现在,我需要了解正则表达式,语法生成和解析器吗?
我想等工具的Yacc /柔性/野牛 - 但我面临的问题是 -
如何使用这些工具?我的意思是,当我阅读这些工具时,我只是在表面上刮擦 - 我感到无能为力。
如何将这些工具与我的C++源代码串联使用?
How "The Hell" do i Get Started with this?
我的目标是制作一个程序(使用C++),它将C源代码作为输入并检查"SYNTAX ERRORS ONLY"
。继续C语法分析器相关项目的混乱
现在,我需要了解正则表达式,语法生成和解析器吗?
我想等工具的Yacc /柔性/野牛 - 但我面临的问题是 -
如何使用这些工具?我的意思是,当我阅读这些工具时,我只是在表面上刮擦 - 我感到无能为力。
如何将这些工具与我的C++源代码串联使用?
How "The Hell" do i Get Started with this?
使用别人的C语法分析器。例如,clang项目使用的解析器。 http://clang.llvm.org/
然后你可以专注于你的问题的其他难题:检测错误。
要开始使用的Yacc和Lex(或GNU的版本,野牛和Flex),我可以推荐汤姆·尼曼的A Compact Guide to Lex & Yacc。
我还建议你看看其他项目做同样的事情。 http://www.splint.org/
它们的名称通常以lint命名,这一切都取决于您想要检查的错误类型。
在任何情况下,您当然需要了解更多关于编译器体系结构的知识。本书是一本参考http://www.cs.princeton.edu/~appel/modern/c/
如果你想在句法层面的工作, 你一定要与lex和yacc工作。 此链接可能会帮助您开始使用正常的语法(尽管已过时):http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
使用正则表达式可以完成较少的强大语法检查。使用正则表达式可以少用实际解析器(请参见http://en.wikipedia.org/wiki/Chomsky_hierarchy)。但它肯定更实用。
如果您想执行高级别检查。像“这组函数一直采用常量参数吗?”等等......你可以使用GCC能力来转储抽象语法树(参见http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast)。检查其他编译器或前端。抽象树包含许多可以“检查”的信息。
如果你想处理编译错误:与类型检查等有关......我不能帮你,你可能要开始编写自己的编译器之前先看看其他人的项目。
还看到:
http://decomp.ulb.ac.be/roelwuyts/playground/canalysistools/
http://wiki.altium.com/display/ADOH/Static+Code+Analysis+-+CERT+C+Secure+Code+Checking
有人在我以前的实验室对C和C++分析和改造 http://www.lrde.epita.fr/cgi-bin/twiki/view/Transformers/ 工作目前该项目处于待机状态,并已被证明是一个即使是用于编译写入的人也是复杂的主题(特别是在C++转换的情况下)。
最后您的需求也许比这更简单。你想想
FILE *output = popen("gcc -Wall my_c_file.c", "r");
(然后就检查GCC的输出)
你如何定义“语法错误ONLY”?如果您只想知道错误是什么,为什么不调用外部gcc来执行编译并报告错误?