我使用ANTLR 4来使用以下链接中提供的语法解析C代码
我要函数的全部内容,包括所有的空格。
下面是我用来遍历解析树的侦听器类
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;
如果我也得到带有所有缩进的代码,也是可以的。
发布于 2017-10-15 04:01:06
保持空白和换行符取决于如何定义相应的lexer规则。有了这条规则:
WS : [ \r\n\t]+ -> skip ;空格被丢弃,而使用此规则:
WS : [ \t\r\n]+ -> channel(HIDDEN) ;它是在getText()中保存和提供的。
通过对C.g4的以下修改:
compilationUnit
@init {System.out.println("C last update 0531");}
@after {System.out.println($text);}
: translationUnit? EOF
;和
Whitespace
: [ \t]+
// -> skip
-> channel(HIDDEN)
;
Newline
: ( '\r' '\n'?
| '\n'
)
// -> skip
-> channel(HIDDEN)
;文件t.text中的输入:
int sumOfCubes() {
int d, sum = 0;
while (n != 0)
{ d = n % 10;
n /= 10;
sum += d;
}
return sum;
}我得到以下结果:
$ 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:
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:
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);
}
}处决:
$ 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;
}https://stackoverflow.com/questions/46748913
复制相似问题