Saya menggunakan Antlr4 untuk mengurai kode C dan saya menggunakan tata bahasa berikut untuk mengurai:

Tautan ke C.g4

Tata bahasa di atas secara default tidak memberikan aturan penguraian apa pun untuk mendapatkan pernyataan praprosesor.

Saya mengubah tata bahasa sedikit untuk mendapatkan baris preprocessor dengan menambahkan baris berikut

externalDeclaration
:   functionDefinition
|   declaration
|   ';' // stray ;
|   preprocessorDeclaration
;

preprocessorDeclaration
:   PreprocessorBlock
;

PreprocessorBlock
:   '#' ~[\r\n]*
    -> channel(HIDDEN)
;

Dan di Jawa saya menggunakan pendengar berikut untuk mendapatkan baris preprocessor

@Override
public void enterPreprocessorDeclaration(PreprocessorDeclarationContext ctx) {
    System.out.println("Preprocessor Directive found");
    System.out.println("Preprocessor: " + parser.getTokenStream().getText(ctx));
}

Metode ini tidak pernah dipicu. Adakah yang bisa menyarankan metode untuk mendapatkan garis preprocessor?

Memasukkan:

#include <stdio.h>

int k = 10;
int f(int a, int b){
int i;
for(i = 0; i < 5; i++){
    printf("%d", i);
}

}

2
Ritwik Bhar 16 Oktober 2017, 12:19
Tata bahasa ada di tautan yang diberikan.
 – 
Ritwik Bhar
16 Oktober 2017, 12:25
Bisakah Anda memberikan setidaknya satu baris input yang Anda coba urai, dimulai dengan # ?
 – 
BernardK
16 Oktober 2017, 12:28
1
#include int main(){ int a = 5; }
 – 
Ritwik Bhar
16 Oktober 2017, 12:31
Saya telah mengedit pertanyaan dan menambahkan masukan
 – 
Ritwik Bhar
16 Oktober 2017, 12:36

1 menjawab

Jawaban Terbaik

Sebenarnya, dengan channel(HIDDEN), aturan preprocessorDeclaration tidak menghasilkan keluaran.

Jika saya menghapus -> channel(HIDDEN), ini berfungsi:

preprocessorDeclaration
@after {System.out.println("Preprocessor found : " + $text);}
    :   PreprocessorBlock
    ;

PreprocessorBlock
    :   '#' ~[\r\n]*
//        -> channel(HIDDEN)
    ;

Eksekusi:

$ grun C compilationUnit -tokens -diagnostics t2.text
[@0,0:17='#include <stdio.h>',<PreprocessorBlock>,1:0]
[@1,18:18='\n',<Newline>,channel=1,1:18]
[@2,19:19='\n',<Newline>,channel=1,2:0]
[@3,20:22='int',<'int'>,3:0]
...
[@72,115:114='<EOF>',<EOF>,10:0]
C last update 1159
Preprocessor found : #include <stdio.h>
line 4:11 reportAttemptingFullContext d=83 (parameterDeclaration), input='int a,'
line 4:11 reportAmbiguity d=83 (parameterDeclaration): ambigAlts={1, 2}, input='int a,'
...
#include <stdio.h>

int k = 10;
int f(int a, int b) {
    int i;
    for(i = 0; i < 5; i++) {
        printf("%d", i);
    }
}

Dalam file CMyListener.java (dari jawaban saya sebelumnya) saya telah menambahkan:

public void enterPreprocessorDeclaration(CParser.PreprocessorDeclarationContext ctx) {
    System.out.println("Preprocessor Directive found");
    System.out.println("Preprocessor: " + parser.getTokenStream().getText(ctx));
}

Eksekusi:

$ java test_c t2.text 
...
parsing ended
>>>> about to walk
Preprocessor Directive found
Preprocessor: #include <stdio.h>
>>> in CMyListener
#include <stdio.h>

int k = 10;
...
}
3
BernardK 16 Oktober 2017, 13:19