gpt4 book ai didi

antlr - 如何使用 ANTLR v4 进行语法高亮显示?

转载 作者:行者123 更新时间:2023-12-01 12:36:41 25 4
gpt4 key购买 nike

我已经为 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 ;

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

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

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

最佳答案

Definitive ANTLR4 Reference 包含第 12.1 段的答案:

不要跳过空格,而是将其发送到隐藏 channel :

WS  :  [ \t\r\n\u000C]+ -> channel(HIDDEN)
;

然后空格在语法的上下文中仍然被忽略(这是我们想要的)并且 getTranslatedText() 将成功返回包括空格在内的所有文本。使用监听器,例如:
public static class HtmlHighlighterListener extends MyDSLBaseListener {
private final CommonTokenStream tokens;
private final TokenStreamRewriter rewriter;

public HtmlHighlighterListener(CommonTokenStream tokens) {
this.tokens = tokens;
this.rewriter = new TokenStreamRewriter(tokens);
}

... Place here the overrides of "enterEveryRule" and "exitEveryRule"

public String getTranslatedText() {
return rewriter.getText();
}
}

ParseTreeWalker walker = new ParseTreeWalker();
HtmlHighlighterListener listener = new HtmlHighlighterListener(tokens);
walker.walk(listener, tree);
return listener.getTranslatedText();

然后,您可以覆盖“enterEveryRule”和“exitEveryRule”以添加用于着色的 HTML 标记。

关于antlr - 如何使用 ANTLR v4 进行语法高亮显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28942168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com