一种在代码中的令牌之间获取字符串的方法

时间:2019-08-19 10:30:58

标签: c# antlr4

我有这样的东西

fragment COMMENT_TEXT : ~(')')* ;
COMMENT : '(' COMMENT_TEXT ')' ;
SLASH_COMMENT : '//' COMMENT_TEXT '//' ;
comment : COMMENT | SLASH_COMMENT ;

并希望获得COMMENT_TEXT字符串编码。这似乎是一个简单的任务,但我只是坚持了一段时间。这是侦听器的一部分:

public override void ExitComment(P.CommentContext context)
{
    var cb = new CommentBlock();
    cb.OriginalText = context.GetText();
    _currentBlock = cb;
}

OriginalText是带有大括号的注释。如何获得COMMENT_TEXT本身? 请提供指向相关文章以解决此问题的链接,而不是Ultimate教程或参考手册本身。

例如,对于这样的输入:

(testCommentText123)

我想得到

CommentBlock.OriginalText == "testCommentText123"

1 个答案:

答案 0 :(得分:2)

在ANTLR中没有访问令牌各个部分的特定方法。您只需要自己拆开琴弦即可。您可以使用正则表达式或通过检查标记类型(以查看它是斜线还是括号注释),然后使用Substring来删除第一个和最后一个2或1(取决于注释的类型)来执行此操作)字符。

PS:您的SLASH_COMMENT规则将匹配文件中第一个//到最后一个//的所有内容。那可能不是您想要的。