如何在ANTLR中获取完整的用户编写语句(包括空格)

Lis*_*isa 6 antlr

我有一个Java语言定义的"语句"定义如下.

statement
: block
|   ASSERT expression (':' expression)? ';'
|   'if' parExpression statement ('else' statement)?
|   'for' '(' forControl ')' statement
|   'while' parExpression statement
|   'do' statement 'while' parExpression ';'
|   'try' block
    ( catches 'finally' block
    | catches
    | 'finally' block
    )
|   'switch' parExpression switchBlock
|   'synchronized' parExpression block
|   'return' expression? ';'
|   'throw' expression ';'
|   'break' Identifier? ';'
|   'continue' Identifier? ';'
|   ';'
|   statementExpression ';'
|   Identifier ':' statement
;
Run Code Online (Sandbox Code Playgroud)

在执行解析器时,我还想打印完整的用户编写的语句(包含语句中的空格),例如:

Object o = Ma.addToObj(r1);
if(h.isFull() && !h.contains(true)) h.update(o);
Run Code Online (Sandbox Code Playgroud)

但是当我在"exitStatement"中使用函数"getText()"时,我只能获取删除了所有空格的语句,例如:

Objecto=Ma.addToObj(r1);
if(h.isFull()&&!h.contains(true))h.update(o);
Run Code Online (Sandbox Code Playgroud)

如何以简单的方式获得完整的用户编写语句(包含语句中的空格)?非常感谢!

完整代码如下:

public class PrintStatements {
public static class GetStatements extends sdlParserBaseListener {
    StringBuilder statements = new StringBuilder();
     public void exitStatement(sdlParserParser.StatementContext ctx){               
            statements.append(ctx.getText());
            statements.append("\n");                        
        }
}


public static void main(String[] args) throws Exception{

String inputFile = null;
if ( args.length>0 ) inputFile = args[0];
InputStream is = System.in;
if ( inputFile!=null ) {
    is = new FileInputStream(inputFile);
}
ANTLRInputStream input = new ANTLRInputStream(is);
sdlParserLexer lexer = new sdlParserLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
sdlParserParser parser = new sdlParserParser(tokens);
ParseTree tree = parser.s();

// create a standard ANTLR parse tree walker
ParseTreeWalker walker = new ParseTreeWalker();
// create listener then feed to walker
GetStatements loader = new GetStatements();
walker.walk(loader, tree);        // walk parse tree   

System.out.println(loader.statements.toString());
}
}
Run Code Online (Sandbox Code Playgroud)

Lis*_*isa 7

我已经通过在语句的上层使用tokens.getText()解决了这个问题,如下所示:

public void exitE(sdlParserParser.EContext ctx) {
    TokenStream tokens = parser.getTokenStream();
    String Stmt = null;
    Stmt = tokens.getText(ctx.statement());
                ...

}
Run Code Online (Sandbox Code Playgroud)