gpt4 book ai didi

java - 如何将条件链变成更快、更简洁的代码?

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

我有 9 种不同的语法。其中一个将根据它正在解析的文件上的 txt 第一行的内容来加载。

我正在考虑将词法分析器/解析器派生到九月。类,然后在我获得匹配时立即实例化它们 - 但不确定这是否会减慢我的速度。我想一些基准测试是适当的。

确实,速度绝对是我的目标,但我知道这是丑陋的代码。

现在代码看起来像这样:

sin.mark(0)
site = findsite(txt)
sin.reset()

if ( site == "site1") {
loadlexer1;
loadparser1;
} else if (site == "site2") {
loadlexer2;
loadparser2;
}
.................
} else if (site == "site8") {
loadparser8;
loadparser8;
}

findsite(txt) {
...................
if line.indexOf("site1-identifier") {
site = site1;
} else if(line.indexOf("site2-identifier") {
site = site2;
} else if(line.indexOf("site3-identifier") {
site = site3;
}
.........................
} else if(line.indexOf("site8-identifier") {
site = site8;
}
}

一些说明

1) 是的,我确实有 9 种用 antlr 构建的不同语法,所以它们都有自己的词法分析器/解析器对象。

2)是的,目前我们正在比较字符串,显然它将被某种整数映射所取代。 我还考虑过将站点标识符粘贴到一个正则表达式中,但我不认为这会加快任何速度。

3)是的,这是伪代码,所以我不会在这里对语义太挑剔..

4) kdgregory 正确地指出我无法创建词法分析器/解析器对的一个实例

我喜欢哈希的想法,可以让代码看起来更好一点,但我不认为它会加快我的速度。

最佳答案

标准方法是使用 Map 将键字符串连接到处理它们的词法分析器:

Map<String,Lexer> lexerMap = new HashMap<String,Lexer>();
lexerMap.put("source1", new Lexer01());
lexerMap.put("source2", new Lexer02());
// and so on

一旦检索到标识要使用的词法分析器的字符串,您就可以从 Map 中检索它,如下所示:

String grammarId = // read it from a file, whatever
Lexer myLexer = lexerMap.get(grammarId);

但是,您的示例代码有一些怪癖。首先,indexOf() 调用表明您没有独立的字符串,并且 Map 不会查看该字符串内部。因此,您需要有某种方法从您读取的任何字符串中提取实际的 key 。

其次,词法分析器和解析器通常会维护状态,因此您将无法创建单个实例并重用它。这表明您需要创建一个工厂类,并将其存储在映射中(这就是抽象工厂模式)。

如果您希望拥有许多不同的词法分析器/解析器,那么使用映射驱动的方法是有意义的。对于少数情况,正确封装的 if-else 链可能是您的最佳选择(这是工厂方法模式)。

关于java - 如何将条件链变成更快、更简洁的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/893855/

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