Я пытаюсь построить сканер для компилятора C- подобного языка, и я получаю эффективный способ генерации токенов... У меня есть функция сканирования:
vector<Token> scan(string &input);
А также основная функция, которая читается в лексически корректном файле и удаляет комментарии. (язык не поддерживает /*, */
comments) Я использую DFA с максимальной меткой для создания токенов... и я уверен, что часть сканера достаточно эффективна. Однако сканер отлично справляется с большими файлами, потому что все они заканчиваются одной строкой... и вся конкатенация 1000 строк файла с линией 1001 ломает сканер. К сожалению, мой FSM не может обрабатывать комментарии, потому что им разрешено содержать любые Unicode и другие нечетные символы. Мне было интересно... есть ли лучший способ перейти от файла в stdin к вектору токенов, имея в виду, что функция scan должна принимать одну строку и возвращать один вектор, а все токены должны быть в один вектор в конце сканирования... В любом случае, вот код, который "сканирует": пожалуйста, не смейтесь над моей плохой идеей слишком сложно :)
string in = "";
string build;
while(true)
{
getline(cin, build);
if( cin.eof() )
break;
if(build.find ("//") != string::npos)
build = build.substr(0, build.find("//",0));
in += " " + build;
}
try {
vector<Token> wlpp = scan(in);
...
...
Несколько вещей, которые вы, возможно, захотите рассмотреть:
in += " " + build;
Является очень неэффективным и, вероятно, не хочу, чтобы вы захотели в этом цикле, но это не похоже на то, где вы столкнулись с проблемами. (по крайней мере, получить представление о размере ваших входов и сделать in.reserve(size)
до этого.
Лучший дизайн для вашего сканера может быть как класс, который обертывает входной файл как istream_iterator<Token>
и реализует соответствующий operator>>
для Token. Если вы действительно хотели это в векторе, вы могли бы сделать что-то вроде vector<Token> v(istream_iterator<Token>(cin), istream_iterator<Token>());
и покончить с этим. Ваш operator>>
затем просто проглотит комментарии и заполнит токен перед возвратом.