首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ANTLR4获取C语言空格的完整函数内容

使用ANTLR4获取C语言空格的完整函数内容
EN

Stack Overflow用户
提问于 2017-10-14 20:13:12
回答 1查看 708关注 0票数 1

我使用ANTLR 4来使用以下链接中提供的语法解析C代码

C.g4语法

我要函数的全部内容,包括所有的空格。

下面是我用来遍历解析树的侦听器类

代码语言:javascript
复制
public class CListnerImpl extends CBaseListener{

@Override
public void enterFunctionDefinition(FunctionDefinitionContext ctx) {
    System.out.println("Function name: " + ctx.declarator().directDeclarator().directDeclarator().getText());;
    System.out.println(ctx.compoundStatement().blockItemList().getText());
}

但是对于这段代码,我得到的函数内容没有任何空格,如

功能名称: sum=0;while(n!=0){d=n%10;n/=10;sum+=d_d_d;}returnsum;,sumOfCubes intd

我想要输出就像

函数名: sum=0;while(n!=0){d=n%10;n/=10;sum+=d_d_d;}return和,sumOfCubes int d;

如果我也得到带有所有缩进的代码,也是可以的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-15 04:01:06

保持空白和换行符取决于如何定义相应的lexer规则。有了这条规则:

代码语言:javascript
复制
WS : [ \r\n\t]+ -> skip ;

空格被丢弃,而使用此规则:

代码语言:javascript
复制
WS : [ \t\r\n]+ -> channel(HIDDEN) ;

它是在getText()中保存和提供的。

通过对C.g4的以下修改:

代码语言:javascript
复制
compilationUnit
@init {System.out.println("C last update 0531");}
@after {System.out.println($text);}
    :   translationUnit? EOF
    ;

代码语言:javascript
复制
Whitespace
    :   [ \t]+
//        -> skip
        -> channel(HIDDEN)
    ;

Newline
    :   (   '\r' '\n'?
        |   '\n'
        )
//        -> skip
        -> channel(HIDDEN)
    ;

文件t.text中的输入:

代码语言:javascript
复制
int sumOfCubes() {
    int d, sum = 0;
    while (n != 0)
        { d = n % 10;
          n /= 10;
          sum += d;
        }
    return sum;
}

我得到以下结果:

代码语言:javascript
复制
$ grun C compilationUnit -diagnostics t.text
C last update 0531
int sumOfCubes() {
    int d, sum = 0;
    while (n != 0)
        { d = n % 10;
          n /= 10;
          sum += d;
        }
    return sum;
}

Java侦听器

文件CMyListener.java

代码语言:javascript
复制
public class CMyListener extends CBaseListener {
    CParser parser;
    public CMyListener(CParser parser) { this.parser = parser; }

    public void exitCompilationUnit(CParser.CompilationUnitContext ctx) {
        System.out.println(parser.getTokenStream().getText(ctx));
    }
}

测试程序,文件test_c.java

代码语言:javascript
复制
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.*;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;

public class test_c {
    public static void main(String[] args) throws IOException {
        ANTLRInputStream input = new ANTLRFileStream(args[0]);
        CLexer lexer = new CLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        CParser parser = new CParser(tokens);
        ParseTree tree = parser.compilationUnit();
        System.out.println("parsing ended");
        ParseTreeWalker walker = new ParseTreeWalker();
        CMyListener my_listener = new CMyListener(parser);
        System.out.println(">>>> about to walk");
        walker.walk(my_listener, tree);
    }
}

处决:

代码语言:javascript
复制
$ javac CMyListener.java
$ javac test_c.java 
$ java test_c t.text 
C last update 0531
int sumOfCubes() {
    int d, sum = 0;
    while (n != 0)
        { d = n % 10;
          n /= 10;
          sum += d;
        }
    return sum;
}
parsing ended
>>>> about to walk
int sumOfCubes() {
    int d, sum = 0;
    while (n != 0)
        { d = n % 10;
          n /= 10;
          sum += d;
        }
    return sum;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46748913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档