如何在antlr规则中输出原始输入

时间:2017-04-28 07:34:32

标签: c# antlr antlr4

我正在使用TSX7代码到S7 SCL的代码转换器。在那里,我希望将原始TSX7代码作为生成的SCL代码中的注释。这个工作到目前为止很好,但我无法弄清楚如何在antrl规则中输出原始输入行,如:

使用TSX7输入线:

!       INC W1469;0->W1465[3]

我喜欢SCL输出,如:

// OLD> !       INC W1469;0->W1465[3] <OLD
W1469 := W1469+1;
W1465 := 0;

为此,我在代码行规则上写了一个动作:

codelines returns [string code] 
    : codeline     
      { 
        _localctx.code = "// OLD> " + _localctx.codeline().GetText() + " <OLD" + Environment.NewLine;
        _localctx.code += _localctx.codeline().code;
      }
    | commentline  
      { 
        _localctx.code = _localctx.commentline().code; 
      }
    ;

(实际的TSX7到SCL翻译在&#34;代码行&#34;规则中完成)

我得到的几乎没问题,但是我错过了字符串中的所有空格,我在调用&#34; _localctx.codeline()时得到了.GetText()&#34;:

// OLD> !INCW1469;0->W1465[3] <OLD
W1469 := W1469+1;
W1465 := 0;

(缺少INC和W1465之间的空间)

有没有办法让原始文本包含所有空格,用作规则的输入&#34;代码行&#34;?

1 个答案:

答案 0 :(得分:0)

您必须直接从ANTLR流访问文本。这可能是带有方法CommonTokenStreamgetHiddenTokensToLeft()的{​​{1}},但这是非常不切实际的。

然而,快速谷歌搜索将this question带入了应该回答您问题的问题。