【问题标题】:CDT Lexer: Get Tokens for commentsCDT Lexer:获取用于评论的令牌
【发布时间】:2019-04-16 12:33:25
【问题描述】:

我想在我的 Eclipse 插件中编写一个可以处理我的工具语言的编辑器。该语言基于带有附加关键字和注释的 C/C++。我成功地编写了自己的语言类,该类扩展了 GPLanguage 并利用了相应的 CDT 扩展点。

我的主要问题是我的语言有keywords inside comments

在这种语言中经常使用这样的东西:

/** @ctPrint
 * 
 * This is a real comment, describing this block.
 *
 * @author    Sadik     // This looks like a comment, but it's part of the syntax. The compiler will treat this in a special way.
 * @tag       CT-001    // The @tag is part of syntax, the real comment starts with //
 * @result    TRUE      // Again, @result is part of the syntax.
 * 
 * This is a final description.
 */

因此,我的编译器(扩展 g++)不会将 cmets 内的某些部分视为 cmets。这就是为什么我想在 eclipse 中突出显示这些部分。

据我从this answer 了解到,在处理原始源代码期间第一个激活的是 Lexer。 这是 CDT Lexer 文档的一部分:

简而言之,这个类转换行尾(到'\n')和三元组
(对应的字符),删除线拼接,cmets 和换行符以外的空格。返回预处理器令牌。

因此,Lexer 会丢弃我的部分源代码并且不会对其进行标记。由于 Lexer 被声明为 final,它的设计目的不是扩展它并重用它的功能。

如果我有一个扩展 CDT 的 GNUCPPParser 的解析器,该解析器将无法“看到”我的 cmets,因为它们没有标记。我怎样才能获得该部分的令牌?

【问题讨论】:

    标签: java java-8 eclipse-plugin eclipse-cdt lexer


    【解决方案1】:

    虽然注释标记没有以通常的方式传递给解析器(例如,它们不会作为consume() 的结果出现),但它们并没有完全丢弃:它们由预处理器保留,并以@987654322 的形式提供@节点通过IASTTranslationUnit.getComments()。您可以使用它来查询 cmets 作为解析后步骤,解析它们的内容,然后突出显示与您的特殊标记对应的源范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      相关资源
      最近更新 更多