有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用antlr4获取预处理器行,并解析C代码

我使用Antlr4解析C代码,并使用以下语法进行解析:

Link to C.g4

默认情况下,上述语法不提供任何解析规则来获取预处理器语句

通过添加以下行,我稍微修改了语法以获得预处理器行

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

preprocessorDeclaration
:   PreprocessorBlock
;

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

在Java中,我使用以下侦听器获取预处理器行

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

该方法永远不会被触发。有人能建议一种方法来获取预处理器行吗

输入:

#include <stdio.h>

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

}


共 (1) 个答案

  1. # 1 楼答案

    实际上,对于channel(HIDDEN),规则preprocessorDeclaration不产生任何输出

    如果我删除-> channel(HIDDEN),它会工作:

    preprocessorDeclaration
    @after {System.out.println("Preprocessor found : " + $text);}
        :   PreprocessorBlock
        ;
    
    PreprocessorBlock
        :   '#' ~[\r\n]*
    //        -> channel(HIDDEN)
        ;
    

    执行:

    $ 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);
        }
    }
    

    CMyListener.java文件中(根据我先前的回答),我添加了:

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

    执行:

    $ 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;
    ...
    }