我的目标是创建一个程序(使用C ++),它将C源代码作为输入并检查 "SYNTAX ERRORS ONLY"
。
现在,我需要了解正则表达式,语法生成和解析器吗?
我想使用像Yacc / Flex / Bison这样的工具 - 但我遇到的问题是 -
如何使用这些工具?我的意思是,当我读到这些工具时,我只是在表面上搔痒 - 我感到无能为力。
如何将这些工具与我的C ++源代码结合使用?
How "The Hell" do i Get Started with this?
答案 0 :(得分:2)
使用其他人的C解析器。例如,clang项目使用的解析器。 http://clang.llvm.org/
然后,您可以专注于问题的另一个难点:检测错误。
答案 1 :(得分:0)
要开始使用Yacc和Lex(或Gnu版本,Bison和Flex),我可以推荐Tom Niemann的A Compact Guide to Lex & Yacc。
答案 2 :(得分:0)
我还建议你看看其他项目做同样的事情。它们的名称通常以lint命名为http://www.splint.org/
答案 3 :(得分:0)
这完全取决于您要检查的错误类型。
在任何情况下,您当然需要了解有关编译器体系结构的更多信息。这本书是参考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)。但它肯定更实际。
如果您想进行高级别检查。就像“这组功能总是采用const参数吗?”等等......您可以使用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的输出)
答案 4 :(得分:0)
如何定义“SYNTAX ERRORS ONLY”?如果您只想知道错误是什么,为什么不调用外部gcc来执行编译并报告错误?