Parsing mit libclang; Bestimmte Token können nicht analysiert werden (Python in Windows)
Ich habe Code (entnommen und angepasst ausHie undHie), das @ verwendlibclang zum Parsen von C ++ - Quelldateien in Python (Widnows) und erhalten Sie alle seinedeclaration statements, wie hier zu sehen:
import clang.cindex
def parse_decl(node):
reference_node = node.get_definition()
if node.kind.is_declaration():
print(node.kind, node.kind.name,
node.location.line, ',', node.location.column,
reference_node.displayname)
for ch in node.get_children():
parse_decl(ch)
# configure path
clang.cindex.Config.set_library_file('C:/Program Files (x86)/LLVM/bin/libclang.dll')
index = clang.cindex.Index.create()
trans_unit = index.parse(r'C:\path\to\sourcefile\test.cpp', args=['-std=c++11'])
parse_decl(trans_unit.cursor)
Für die folgende C ++ - Quelldatei test_ok.cpp
):
/* test_ok.cpp
*/
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
int main (int argc, char *argv[]) {
int linecount = 0;
double array[1000], sum=0, median=0, add=0;
string filename;
if (argc <= 1)
{
cout << "Error: no filename specified" << endl;
return 0;
}
//program checks if a filename is specified
filename = argv[1];
ifstream myfile (filename.c_str());
if (myfile.is_open())
{
myfile >> array[linecount];
while ( myfile.good() )
{
linecount++;
myfile >> array[linecount];
}
myfile.close();
}
dasparse
-Methode analysiert wie es sollte und gibt Folgendes aus:
CursorKind.USING_DIRECTIVE USING_DIRECTIVE 10 , 17 std
CursorKind.FUNCTION_DECL FUNCTION_DECL 12 , 5 main(int, char **)
CursorKind.PARM_DECL PARM_DECL 12 , 15 argc
CursorKind.PARM_DECL PARM_DECL 12 , 27 argv
CursorKind.VAR_DECL VAR_DECL 13 , 7 linecount
CursorKind.VAR_DECL VAR_DECL 14 , 10 array
CursorKind.VAR_DECL VAR_DECL 14 , 23 sum
CursorKind.VAR_DECL VAR_DECL 14 , 30 median
CursorKind.VAR_DECL VAR_DECL 14 , 40 add
CursorKind.VAR_DECL VAR_DECL 15 , 10 filename
CursorKind.VAR_DECL VAR_DECL 23 , 12 myfile
Process finished with exit code 0
JEDOC,
für die folgende C ++ - Quelldatei test.cpp
):
/* test.cpp
*/
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
void readfunction(vector<double>& numbers, ifstream& myfile)
{
double number;
while (myfile >> number) {
numbers.push_back(number);}
}
double meanfunction(vector<double>& numbers)
{
double total=0;
vector<double>::const_iterator i;
for (i=numbers.begin(); i!=numbers.end(); ++i) {
total +=*i; }
return total/numbers.size();
}
dasparsing ist unvollständig:
CursorKind.USING_DIRECTIVE USING_DIRECTIVE 8 , 17 std
CursorKind.VAR_DECL VAR_DECL 10 , 6 readfunction
Process finished with exit code 0
die Analyse kann die Zeilen wie @ nicht verarbeitvector<double>& numbers
etc und hört auf, diesen Teil des Codes zu analysieren.
Ich glaube, das Problem ist ähnlich wie in einem anderen beschriebenSO frage. Ich habe versucht, das @ explizit zu verwendstd=c++11
parse Argument ohne Erfolg. In einem (nAntworte dieser Frage (obwohl es das Problem nicht gelöst hat) die Verwendung von-x c++
wird auch vorgeschlagen, aber Ich habe keine Ahnung, wie ich das in meinem obigen Code hinzufügen soll.
Anyone kann auf eine Lösung für libclang verweisen, um C ++ - Anweisungen wie die in @ zu analysieretest.cpp
?
Auch kann ich es so machen, dass es weiter analysiert, obwohl es, wenn es zu einem Token kommt, nicht analysiert werden kann?