注意:我正在使用C++14标志进行编译... 我正在尝试在C++中创建一个非常简单的词法分析器。我正在使用正则表达式来识别不同的令牌。我的程序能够识别令牌并显示它们。但输出的格式为
int
main
hello
2
*
3
+
return
我希望输出的形式为:
int IDENTIFIER
hello IDENTIFIER
* OPERATOR
3 NUMBER
so on...........
我无法达到上述输出。
这是我的程序:
#include <iostream>
#include <string>
#include <regex>
#include <iterator>
#include <map>
using namespace std;
int main()
{
string str = " hello how are 2 * 3 you? 123 4567867*98";
// define list of token patterns
map<string, string> v
{
{"[0-9]+" , "NUMBERS"} ,
{"[a-z]+" , "IDENTIFIERS"},
{"[\\*|\\+", "OPERATORS"}
};
// build the final regex
string reg = "";
for(auto it = v.begin(); it != v.end(); it++)
reg = reg + it->first + "|";
// remove extra trailing "|" from above instance of reg..
reg.pop_back();
cout << reg << endl;
regex re(reg);
auto words_begin = sregex_iterator(str.begin(), str.end(), re);
auto words_end = sregex_iterator();
for(sregex_iterator i = words_begin; i != words_end; i++)
{
smatch match = *i;
string match_str = match.str();
cout << match_str << "\t" << endl;
}
return 0;
}
什么是最优的方法来完成它,并保持令牌在源程序中出现的顺序?
lex
或flex
)。你可以在大约5分钟内为所需构建一个词法分析器(并且它将更加高效)。 - Martin York