- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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/
我正在用 C# 编写动态语言的解释器,并将原始函数实现为具有虚拟 Apply 方法的抽象类 Primitive,其中每个实际原始函数都是重写 Apply 的子类。 (另一种方法是只拥有类 Primit
我正在用 C# 编写动态语言的解释器,并将原始函数实现为具有虚拟 Apply 方法的抽象类 Primitive,其中每个实际原始函数都是重写 Apply 的子类。 (另一种方法是只拥有类 Primit
我是 Dapper 的新手我正在尝试了解它实际上是如何映射事物的。我有以下数据库结构: calendar | Id | Name | meeting_room | Id | Calendar_id
抱歉问题标题很糟糕。有没有办法在一行中做到这一点: Button button = (Button)Gridview.Cells[0].FindControl("controlname"); butt
在 Java 中在声明点和使用点声明列表/数组文字的tersest方法是什么? 作为次要问题,我更喜欢一种不会导致编译时警告或要求抑制警告的方法。 注意:就我个人而言,这是针对Java 8ish on
什么是现代、简洁、快速的方法来测试节点是否有任何与给定选择器匹配的子节点? “简洁”是指类似于 jQuery 或函数式风格,例如避免循环。我知道本地选择器越来越多地使用这种类型的东西,但没有跟上发展的
getFirstNotNullResult 执行函数列表,直到其中一个函数返回非空值。 如何更优雅/简洁地实现 getNotNullFirstResult? object A { def main
根据 stackoverflow 上某人的推荐,我使用了 jquery succint https://github.com/micjamking/Succinct截断我在 php 网站上的帖子。 它
我是一名优秀的程序员,十分优秀!