gpt4 book ai didi

java - 获取 Antlr 规则的原始文本

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:55 25 4
gpt4 key购买 nike

我是 ANTLR 初学者,想计算符号的 SHA1-Hash。

我的简化示例语法:

grammar Example;

method @after{calculateSha1($text); }: 'call' ID;

ID: 'A'..'Z'+;
WS: (' '|'\n'|'\r')+ {skip(); }
COMMENT: '/*' (options {greedy=false;}: .)* '*/' {$channel=HIDDEN}

当词法分析器移除所有空格时,不同的字符串 callABCcall/* DEF */ABC 不幸地得到了相同的 SHA1-Hash 值。

是否有可能获得开始和结束标记之间的规则的“原始”文本以及所有跳过的空格和其他 channel 的文本?

(我想到的一种可能性是将所有字符加入 WS- 和 COMMENT-lexer 规则中,但还有更多规则,所以这是很实用。)

我使用标准的 ANTLRInputStream 来提供 Lexer,但我不知道如何接收原始文本。

最佳答案

代替 skip()-ping WS token ,将它也放在 HIDDEN channel 上:

grammar Example;

@parser::members {
void calculateSha1(String text) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("SHA-1");
byte[] sha1 = md.digest(text.getBytes());
System.out.println(text + "\n" + java.util.Arrays.toString(sha1) + "\n");
} catch(Exception e) {
e.printStackTrace();
}
}
}

parse
: method+ EOF
;

method
@after{calculateSha1($text);}
: 'call' ID
;

ID : 'A'..'Z'+;
WS : (' ' | '\t' | '\n' | '\r')+ {$channel=HIDDEN;};
COMMENT : '/*' .* '*/' {$channel=HIDDEN;};

上面的语法可以用:

import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
String source = "call ABC call /* DEF */ ABC";
ExampleLexer lexer = new ExampleLexer(new ANTLRStringStream(source));
ExampleParser parser = new ExampleParser(new CommonTokenStream(lexer));
parser.parse();
}
}

这会将以下内容打印到控制台:

call ABC[48, -45, 113, 5, -52, -128, -78, 75, -52, -97, -35, 25, -55, 59, -85, 96, -58, 58, -96, 10]call /* DEF */ ABC[-57, -2, -115, -104, 77, -37, 4, 93, 116, -123, -47, -4, 33, 42, -68, -95, -43, 91, 94, 77]

即:相同的解析器规则,但不同的 $text(因此不同的 SHA1)。

关于java - 获取 Antlr 规则的原始文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7443860/

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