如何使用ANTLR v4进行语法高亮?

Adr*_*ien 6 antlr antlr4

我已经为 DSL 构建了语法,并且想以某些颜色显示一些元素(表名称)。我从 Java 输出 HTML。

columnIdentifier :
      columnName=Identifier
    | tableName=Identifier '.' columnName=Identifier
    ;

Identifier : Letter LetterOrDigit* ;
fragment Letter : [a-zA-Z_];
fragment LetterOrDigit : [a-zA-Z0-9_];

WS  :  [ \t\r\n\u000C]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)

我考虑过使用 AbstractParseTreeVisitor 按原样返回所有元素,除了那些我想突出显示的将作为<span class="tablename" >theoriginaltext</span>. 这是一个好方法吗?

请注意,空格在发送到解析器之前会被消除,对吗?因此,如果我使用 AbstractParseTreeVisitor 重建输出,我将无法重建空间。

我认为有一种使用 ANTLR4 进行语法突出显示的规范方法。很难找到这方面的信息,因为搜索经常返回有关在 Eclipse/IDEA 中突出显示 Antlr4 文件的结果。

ibr*_*041 1

为什么需要访客?或者甚至是解析器?纯粹的词法分析器不足以进行词法分类吗?

当我使用代码缩进工具时,我必须

  • 生成 AST
  • 将 AST 克隆到我的“熟”树中,其中(几乎)每片叶子都包含一些词法分析器标记
  • 然后我(再次)迭代词法分析器,并且必须将所有隐藏标记附加到最接近的非隐藏标记。对于 AST 树中存在的那些。
    • 想象一下你有两个有序的 token 流,一个是词法分析器,另一个是递归遍历 AST 树。然后你将这两个“流”加入到第三个“流”中 - 生成一棵也具有隐藏标记的 AST 树
  • 当我递归地遍历树时,能够重建整个输入文本 - 包括注释和空格。

PS:只有当 AST 构造从不切换子节点的顺序时,这才有效。