antlr - 在Antlr4中使用text属性时如何保留空白

标签 antlr antlr4

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

IF L > 40 THEN;

ELSE

  IF A = 20 THEN
      PUT "HELLO";

在这种情况下,我想将其转换为:
if (!(L>40){

      if (A=20)
          put "hello";
}

Antlr中的规则是:
stmt_if_block: IF expr
               THEN x=stmt
               (ELSE y=stmt)?
               {
                 if ($x.text.equalsIgnoreCase(";"))
                 {
                   WriteLn("if(!(" + $expr.text +")){");
                   WriteLn($stmt.text);
                   Writeln("}");
                 }
               }

但是结果看起来像:
if(!(L>40))
{
   ifA=20put"hello";
}

原因是$stmt中的空白已删除。我想知道是否还有保留这些空白的地方
太感谢了

更新:如果我添加
SPACE: [ ] -> channel(HIDDEN);

空格将被保留,结果如下所示, token 之间有许多空格:
 IF SUBSTR(WNAME3,M-1,1) = ')'             THEN                                        M = L;                                  ELSE                                        M = L - 1;

最佳答案

这正是我用于此目的的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));
}

由于您使用的是Java,因此必须对其进行翻译,但它应该简单明了-API相同。

说明:获取第一个 token ,获取最后一个 token ,并从输入流中获取第一个 token 的第一个字符与最后一个 token 的最后一个字符之间的文本。

关于antlr - 在Antlr4中使用text属性时如何保留空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26524302/

相关文章:

java - 是否有任何使用 ANTLR 或类似语言实现的简单语言?

antlrworks - 如何在ANTLR 4字符串匹配中排除“和\?

antlr4 - 在 ANTLR4 语法中嵌入访问者/听众选项

ANTLR4 解析树简化

java - 在antlr访问者模式中如何从一种方法导航到另一种方法

java - 将Python语法中的ANTLR4嵌入java转换为C#

antlr - 如何使用 ANTLR 语法排除字符/符号?

java - 使用 JavaParser 更改方法级别的字符串变量

java - 无法解释 ANTLRWorks 输出

ANTLR4 词法分析器无法解决语法顺序中的歧义