У меня есть 9 разных грамматик. Один из них будет загружен в зависимости от того, что первая строка txt находится в файле, который он разбор.Как превратить условную цепочку в более быстрый уродливый код?
Я думал о том, чтобы вывести лексер/парсер, размножающийся в sep. классы, а затем создавая их, как только я получу матч - не уверен, что это замедлит меня или нет. Я думаю, что некоторые бенчмаркинга в порядке.
Действительно, скорость определенно моя цель здесь, но я знаю, что это уродливый код.
Щас код выглядит примерно так:
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 так что они будут иметь свой собственный лексер/parser objs.
2) да, на данный момент мы сравниваем строки и obivously, которые заменяются каким-то целым отображением. Я также рассматривал возможность прикрепления идентификаторов сайтов к одному регулярному выражению, однако я не верю, что это ускорит что-то.
3) да, это псевдокод, так что я бы не слишком разборчивы в семантике здесь ..
4) kdgregory является правильным, отмечая, что я не могу создать один экземпляр пары лексического анализатора/парсера
Мне нравится идея хеш-кода, чтобы код выглядел немного лучше, но я не думаю, что это будет скорость меня.
Собственно, это не выглядит так плохо. И это одна из причин, по которой они построили такую команду if-else, как раз для этой ситуации. Что касается скорости, она должна быть коротко замкнута как можно быстрее. –
Пожалуйста, скажите, что вы не устанавливаете 'site' в строку маркера и используете сравнения строк, чтобы проверить это. Это действительно ints или что-то, не так ли? –
Кроме того, я думаю, вы имеете в виду if (line.indexOf (...)> = 0)) – Mark