Повышение эффективности std :: string в компиляторе

0

Я пытаюсь построить сканер для компилятора 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);
  ...
  ...
Теги:
performance
lexical-analysis
stdin
tokenize

1 ответ

1

Несколько вещей, которые вы, возможно, захотите рассмотреть:

in += " " + build;

Является очень неэффективным и, вероятно, не хочу, чтобы вы захотели в этом цикле, но это не похоже на то, где вы столкнулись с проблемами. (по крайней мере, получить представление о размере ваших входов и сделать in.reserve(size) до этого.

Лучший дизайн для вашего сканера может быть как класс, который обертывает входной файл как istream_iterator<Token> и реализует соответствующий operator>> для Token. Если вы действительно хотели это в векторе, вы могли бы сделать что-то вроде vector<Token> v(istream_iterator<Token>(cin), istream_iterator<Token>()); и покончить с этим. Ваш operator>> затем просто проглотит комментарии и заполнит токен перед возвратом.

  • 0
    Это, кажется, хорошее решение, однако оно дает мне идею использовать поток строк вместо оператора +. Знаете ли вы, как это сравнивается с использованием istream_iterator?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню