gpt4 book ai didi

antlr - 替换 ANTLR 中的 token

转载 作者:行者123 更新时间:2023-12-04 03:06:43 25 4
gpt4 key购买 nike

我想使用 ANTLR 替换 token 。

我尝试使用 TokenRewriteStream 并进行替换,但没有成功。

有什么建议吗?

  ANTLRStringStream in = new ANTLRStringStream(source);
MyLexer lexer = new MyLexer(in);
TokenRewriteStream tokens = new TokenRewriteStream(lexer);
for(Object obj : tokens.getTokens()) {
CommonToken token = (CommonToken)obj;
tokens.replace(token, "replacement");
}

词法分析器找到所有出现的单行注释,我也想在原始源代码中替换它们。

编辑:

这是语法:

grammar ANTLRTest;

options {
language = Java;
}

@header {
package main;
}

@lexer::header {
package main;
}

rule: SingleLineComment+;

SingleLineComment
: '//' ~( '\r' | '\n' )* {setText("replacement");}
;

比方说,我想做的是替换文件中的所有单行注释。

最佳答案

重写词法分析器中的文本:

SingleLineComment
: '//' ~('\r' | '\n')* {setText("replacement");}
;

编辑

好的,这是一个快速演示,您可以如何从一种语言中过滤某些标记:

SingleCommentStrip.g

grammar SingleCommentStrip;

parse returns [String str]
@init{StringBuilder builder = new StringBuilder();}
: (t=. {builder.append($t.text);})* EOF {$str = builder.toString();}
;

SingleLineComment
: '//' ~('\r' | '\n')* {skip();}
;

MultiLineComment
: '/*' .* '*/'
;

StringLiteral
: '"' ('\\' . | ~('"' | '\\' | '\r' | '\n'))* '"'
;

AnyOtherChar
: .
;

主程序.java

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
SingleCommentStripLexer lexer = new SingleCommentStripLexer(new ANTLRFileStream("Test.java"));
SingleCommentStripParser parser = new SingleCommentStripParser(new CommonTokenStream(lexer));
String adjusted = parser.parse();
System.out.println(adjusted);
}
}

测试.java

// COMMENT
class Test {
/*
// don't remove
*/
// COMMENT AS WELL
String s = "/* don't // remove */ \" \\ me */ as well";
}

现在运行演示:

java -cp antlr-3.3.jar org.antlr.Tool SingleCommentStrip.g
javac -cp antlr-3.3.jar *.java
java -cp .:antlr-3.3.jar Main

将打印:

class Test {  /*  // don't remove  */  String s = "/* don't // remove */ \" \\ me */ as well";}

(即单行注释被移除)

关于antlr - 替换 ANTLR 中的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878528/

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