Advertisement
Fare9

tokenizer.cpp

Apr 21st, 2020
570
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. extern "C" {
  2. #include "clang-c/Index.h"
  3. }
  4. #include "llvm/Support/CommandLine.h"
  5. #include "llvm/Support/raw_ostream.h"
  6.  
  7. using namespace llvm;
  8.  
  9. static cl::opt<std::string> FileName(cl::Positional, cl::desc("Input File"), cl::Required);
  10.  
  11. int
  12. main(int argc, char** argv)
  13. {
  14.     cl::ParseCommandLineOptions(argc, argv, "Tokenizer example\n");
  15.     CXIndex index = clang_createIndex(0,0);
  16.     const char *args[] = {
  17.         "-I/usr/include",
  18.         "-I."
  19.     };
  20.  
  21.     CXTranslationUnit translationUnit =
  22.         clang_parseTranslationUnit(index, FileName.c_str(), args, 2, NULL, 0, CXTranslationUnit_None);
  23.    
  24.     CXFile file = clang_getFile(translationUnit, FileName.c_str());
  25.     CXSourceLocation loc_start = clang_getLocationForOffset(translationUnit, file, 0);
  26.     CXSourceLocation loc_end = clang_getLocationForOffset(translationUnit, file, 60);
  27.     CXSourceRange range = clang_getRange(loc_start, loc_end);
  28.     unsigned numTokens = 0;
  29.     CXToken *tokens = nullptr;
  30.     clang_tokenize(translationUnit, range, &tokens, &numTokens);
  31.  
  32.     for (unsigned i = 0; i < numTokens; ++i)
  33.     {
  34.         enum CXTokenKind kind = clang_getTokenKind(tokens[i]);
  35.         CXString name = clang_getTokenSpelling(translationUnit, tokens[i]);
  36.         CXSourceLocation loc = clang_getTokenLocation(translationUnit, tokens[i]);
  37.  
  38.         CXString fName;
  39.         unsigned line = 0, col = 0;
  40.         clang_getPresumedLocation(loc, &fName, &line, &col);
  41.  
  42.         switch (kind)
  43.         {
  44.         case CXToken_Punctuation:
  45.             outs() << "PUNCTUATION(" << clang_getCString(name) << ") ";
  46.             break;
  47.         case CXToken_Keyword:
  48.             outs() << "KEYWORD(" << clang_getCString(name) << ") ";
  49.             break;
  50.         case CXToken_Identifier:
  51.             outs() << "IDENTIFIER(" << clang_getCString(name) << ") ";
  52.             break;
  53.         case CXToken_Literal:
  54.             outs() << "COMMENT(" << clang_getCString(name) << ") ";
  55.             break;
  56.         default:
  57.             outs() << "UNKNOWN(" << clang_getCString(name) << ") ";
  58.             break;
  59.         }
  60.  
  61.         outs() << "\tLoc=<" << clang_getCString(fName) << "," << line << "," << col << ">\n";
  62.  
  63.         clang_disposeString(name);
  64.         clang_disposeString(fName);
  65.     }
  66.  
  67.     outs() << "\n";
  68.     clang_disposeTokens(translationUnit, tokens, numTokens);
  69.     clang_disposeTranslationUnit(translationUnit);
  70.     return 0;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement