я мог смотреть в std::stringstream
от <sstream>
. C-style strtok
имеет ряд проблем с удобством использования, а строки в стиле C просто хлопотны.
Вот ультра-тривиальный пример его tokenizing фразы слов:
#include <sstream>
#include <iostream>
#include <string>
int main(void)
{
std::stringstream sentence("This is a sentence with a bunch of words");
while (sentence)
{
std::string word;
sentence >> word;
std::cout << "Got token: " << word << std::endl;
}
}
[email protected]:/tmp$ g++ tokenize.cc && ./a.out
Got token: This
Got token: is
Got token: a
Got token: sentence
Got token: with
Got token: a
Got token: bunch
Got token: of
Got token: words
Got token:
std::stringstream
класс «двунаправленный», в том, что он поддерживает ввод и вывод. Вы, вероятно, захотите сделать только один или другой, так что вы бы использовали std::istringstream
или std::ostringstream
.
Красота из них является то, что они также являются std::istream
и std::ostream
s соответственно, так что вы можете использовать их, как вы будете использовать std::cin
или std::cout
, которые являются надеюсь, вам знакомы.
Некоторые могут утверждать, что эти классы дороги в использовании; std::strstream
от <strstream>
- это в основном то же самое, но построено на вершине более дешевых строк с 0-концевыми строками C-стиля. Это может быть быстрее для вас. Но в любом случае, я бы не стал беспокоиться о производительности сразу. Получите что-то работающее, а затем сравните его. Скорее всего, вы можете получить достаточную скорость, просто написав хорошо написанный C++, который минимизирует ненужное создание и уничтожение объектов. Если это еще не достаточно быстро, вы можете посмотреть в другом месте. Тем не менее, эти классы, вероятно, достаточно быстры. Ваш процессор может тратить тысячи циклов на время, затрачиваемое на чтение блока данных с жесткого диска или сети.
strtok является ** не ** в Tokenizer. Вам все еще нужно выяснить разницу между «классом» или «const» или идентификатором, который называется «рассчитать». –
Токенизатор * идентифицирует * токены и послесловия * лексический расширитель * классифицирует их в токены (то есть фраза «joe utes» -> токенизатор -> {joe, ats} -> лексический анализатор -> {(joe, существительное), (ест, глагол)}). Токенизация - это процесс демаркации * и ** возможно ** классификации разделов строки входных символов. В классифицирующем состоянии ни токенизатор усиления не выполняет классификацию. – clyfe
http://stackoverflow.com/questions/380455/looking-for-a-clear-definition-of-what-a-tokenizer-parser-and-lexers-are-a – clyfe