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