在下面的代码中,我使用clang API解析C代码,然后尝试
1)在代码中添加HTML页眉和页脚,以便在浏览器中查看
2)获取IF语句的THEN部分的行号并打印它。
我在(2)遇到麻烦。我无法理解输出。对于以下输入(添加了行号),我得到(相关)输出为
行号是6
行号是6
行号是6
行号是6
行号为12
行号为12
行号为12
行号为12
我希望它分别是4和8。有人可以解释我错在哪里吗?
我的输入如下(请删除行号或转到http://pastebin.com/hF5yMMAz)
%nl myinput.c
1 #include <stdio.h> 2 int func (int abc, int xyz) { 3 if (abc-1) 4 { 5 printf ("1\n"); 6 } 7 if (abc-2) 8 { 9 printf ("2\n");
10}
11
12返回0;
13}
我的代码位于以下位置(只有一个文件) http://pastebin.com/txF9Bwa4
要编译代码,请运行以下命令:
CLANG_INSTALL = / USR / INSTALLDIR /
g ++ -I $ CLANG_INSTALL / include / -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -g -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fno-common -Woverloaded-virtual -Wcast-qual - fno-rtti -c -o rewritersample.o rewritersample.cpp
g ++ -g -I $ CLANG_INSTALL / include / -o rewritersample rewritersample.o -lclangTooling -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangAnalysis -lclangARCMigrate -lclangRewriteFrontend -lclangRewriteCore - lclangEdit -lclangAST -lclangLex -lclangBasic -lLLVMIRReader -lLLVMBitReader -lLLVMAsmParser -lLLVMHexagonCodeGen -lLLVMHexagonAsmPrinter -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMMBlazeDisassembler -lLLVMMBlazeCodeGen -lLLVMMBlazeDesc -lLLVMMBlazeAsmPrinter -lLLVMMBlazeAsmParser -lLLVMMBlazeInfo -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc - lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMip sAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMSparcCodeGen -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser - lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCDisassembler -lLLVMMCParser -lLLVMInstrumentation -lLLVMInterpreter -lLLVMipo -lLLVMVectorize -lLLVMLinker -lLLVMBitWriter -lLLVMMCJIT -lLLVMJIT -lLLVMCodeGen -lLLVMObjCARCOpts -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMRuntimeDyld - lLLVMExecutionEngine -lLLVMTarget -lLLVMMC -lLLVMObject -lLLVMCore -lLLVMSupport -L $ CLANG_INSTALL / lib / -lz -lpthread -lm -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMTarget -lLLVMCore -lLLVMMC -lLLVMObject -lLLVMSupport -ldl
要运行代码,命令是
$。/ rewritersample ./myinput.c
答案 0 :(得分:1)
这里有两个问题:
getLocStart
上呼叫IfStatement
,而不是Then
,因此您获得了if
令牌的起始位置,而不是{{1}在{
正文中。if
默认情况下仅为非空行指定数字。在http://pastebin.com/hF5yMMAz中,很明显nl
语句从第6行和第12行开始,而不是在问题中编号为3和7的行。使用if
可以正确编号。