Bonjour à tous
Je parse des fichiers C pour en extraire la liste des variables utilisées dans un code C. Pour cela je parse les fichiers C avec le code suivant:
Tout fonctionne bien sauf dans un cas, celui ou un bout de code est défini par une macro
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 protected void runParser(File currentFile) { try { /* paramètres de configurations du parseur */ IParserLogService log = new DefaultLogService(); CodeReader reader = new CodeReader(currentFile.getAbsolutePath()); ICodeReaderFactory readerFactory = new CodeReaderFactory(); IScannerInfo info = new ScannerInfo(); try { /* Creation du parseur */ IScanner scanner = new CPreprocessor(reader, info, ParserLanguage.C, new NullLogService(),new ScannerExtensionConfiguration(),readerFactory); ISourceCodeParser parser = new GNUCSourceParser(scanner, ParserMode.COMPLETE_PARSE, new NullLogService(), GCCParserExtensionConfiguration.getInstance(), null); IASTTranslationUnit translationUnit = parser.parse(); /* lancement du traitement du fichier C */ runChecker(translationUnit); } catch (Exception e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } }
je m'explique:
Mon code contient des macros du style:
L'assignation se fait soit par un assignation directe dans la mémoire soit par l'intermédiaire d'une fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #define setVar_var1(value) var1=value; #define setVar_var2(value) functionSet(value) unsigned char var1; extern void functionSet(unsigned char val); int main(void) { setVar_var1(10); setVar_var2(10); return 0; }
Quand je parse le fichier, dans le cas de Var1 , cela me renvoie bien un CASTBinaryExpression tandis que dans le cas var2 j'obtiens un CASTFunctionCallExpression. j'ai donc bien parsé un fichier preprocessés.
Le CASTBinaryExpression est constitué de deux CASTIdExpression op1 et op2.
Dans mon cas op1 devrait valoir "var1" et op2 "10", mais je obtiens pour op1 et op2 la valeur "setVar_va1(10)", donc la ligne de code avant preprocessing.
Comment puis-je faire pour contourner ce problème ?
Cordialement
Partager