在Antlr4中使用text属性时如何保留空格

Hai*_*ham 4 antlr antlr4

当我调用令牌的文本属性时,我想保留空格,有什么办法吗?情况如下:我们有以下代码

IF L > 40 THEN;

ELSE

  IF A = 20 THEN
      PUT "HELLO";
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想将其转换为:

if (!(L>40){

      if (A=20)
          put "hello";
}
Run Code Online (Sandbox Code Playgroud)

Antlr中的规则是:

stmt_if_block: IF expr
               THEN x=stmt
               (ELSE y=stmt)?
               {
                 if ($x.text.equalsIgnoreCase(";"))
                 {
                   WriteLn("if(!(" + $expr.text +")){");
                   WriteLn($stmt.text);
                   Writeln("}");
                 }
               }
Run Code Online (Sandbox Code Playgroud)

但结果如下:

if(!(L>40))
{
   ifA=20put"hello";
}
Run Code Online (Sandbox Code Playgroud)

原因是$stmt移除了空白区域.我想知道是否还有保留这些空白区域非常
感谢你

更新:如果我添加

SPACE: [ ] -> channel(HIDDEN);
Run Code Online (Sandbox Code Playgroud)

空间将被保留,结果如下所示,令牌之间有许多空格:

 IF SUBSTR(WNAME3,M-1,1) = ')'             THEN                                        M = L;                                  ELSE                                        M = L - 1;
Run Code Online (Sandbox Code Playgroud)

Luc*_*ski 9

这是我用于此目的的C#扩展方法:

public static string GetFullText(this ParserRuleContext context)
{
    if (context.Start == null || context.Stop == null || context.Start.StartIndex < 0 || context.Stop.StopIndex < 0)
        return context.GetText(); // Fallback

    return context.Start.InputStream.GetText(Interval.Of(context.Start.StartIndex, context.Stop.StopIndex));
}
Run Code Online (Sandbox Code Playgroud)

既然你正在使用java,你必须翻译它,但它应该是直截了当的 - API是相同的.

说明:获取第一个标记,获取最后一个标记,并从第一个标记的第一个字符和最后一个标记的最后一个字符之间的输入流中获取文本.


iva*_*kov 9

@Lucas解决方案,但是在java中,以防你在翻译时遇到麻烦:

private String getFullText(ParserRuleContext context) {
    if (context.start == null || context.stop == null || context.start.getStartIndex() < 0 || context.stop.getStopIndex() < 0)
        return context.getText();

    return context.start.getInputStream().getText(Interval.of(context.start.getStartIndex(), context.stop.getStopIndex()));
}
Run Code Online (Sandbox Code Playgroud)