tôi có thể nhìn vào std::stringstream
từ <sstream>
. C-style strtok
có một số vấn đề về khả năng sử dụng và các chuỗi kiểu C chỉ gây rắc rối.
Dưới đây là một ví dụ cực kỳ tầm thường của nó tokenizing một câu diễn tả bằng lời:
#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:
Lớp std::stringstream
là "hai chiều", ở chỗ nó hỗ trợ đầu vào và đầu ra. Bạn có thể muốn làm chỉ một hoặc khác, vì vậy bạn sẽ sử dụng std::istringstream
hoặc std::ostringstream
.
Vẻ đẹp của họ là họ cũng std::istream
và std::ostream
s tương ứng, vì vậy bạn có thể sử dụng chúng như bạn muốn sử dụng std::cin
hoặc std::cout
, đó là hy vọng quen thuộc với bạn.
Một số có thể cho rằng các lớp này rất tốn kém để sử dụng; std::strstream
từ <strstream>
chủ yếu là giống nhau, nhưng được xây dựng trên đầu dây C có kiểu 0 giá rẻ hơn. Nó có thể nhanh hơn cho bạn. Nhưng dù sao đi nữa, tôi sẽ không lo lắng về hiệu suất ngay lập tức. Nhận một cái gì đó làm việc, và sau đó điểm chuẩn nó. Rất có thể bạn có thể có đủ tốc độ bằng cách viết đơn giản bằng C++ để giảm thiểu việc tạo và phá hủy đối tượng không cần thiết. Nếu nó vẫn không đủ nhanh, thì bạn có thể tìm ở nơi khác. Tuy nhiên, những lớp này có lẽ đủ nhanh. CPU của bạn có thể lãng phí hàng nghìn chu kỳ trong khoảng thời gian cần để đọc một khối dữ liệu từ một đĩa cứng hoặc mạng.
strtok là ** không ** một tokenizer. Bạn vẫn phải tìm ra sự khác biệt giữa 'class' hoặc' const' hoặc một định danh xảy ra được đặt tên là 'calculate'. –
Trình xác thực * xác định * mã thông báo và mật khẩu * từ khóa * phân loại chúng thành các thẻ (ví dụ: cụm từ "joe eats" -> tokenizer -> {joe, eats} -> lexical analizer -> {(joe, danh từ), (ăn, động từ)}). Tokenization là quá trình * phân định * và ** có thể ** phân loại các phần của một chuỗi các ký tự đầu vào. Trong phân loại sence không phải là tokenizer tăng không phân loại. – clyfe
http://stackoverflow.com/questions/380455/looking-for-a-clear-definition-of-what-a-tokenizer-parser-and-lexers-are-a – clyfe