gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:30:53 27 4
gpt4 key购买 nike

调用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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com