我正在为我的编程语言使用 C++ 编写 Lexer。然后不知从哪里冒出来,这个
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to 'WinMain@16'
东西被扔进去了。
我在 cmd 上使用 g++ 来编译“Lexer.cpp”文件。我知道它与
main()
函数或“WinMain”(不知道那是什么)有关。我见过一些有点像我的问题,但我尝试过的任何方法都没有用。他们讨论过使用一些不同的东西来解决这个问题,但我的代码不适合这些。如果有人关闭了这个问题,请在关闭这个问题之前检查代码的工作方式和情况。
无论如何,这是我的“Lexer.cpp”:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
enum TokenType {
IDENTIFIER,
KEYWORD,
OPERATOR,
DELIMITER,
LITERAL,
UNKNOWN
};
struct Token {
TokenType type;
string value;
};
bool is_keyword(string s) {
vector<string> keywords = {"include", "using", "namespace", "std", "vector", "string", "char", "int", "for", "if", "else", "return"};
for (string keyword : keywords) {
if (s == keyword) {
return true;
}
}
return false;
}
bool is_operator(string s) {
vector<string> operators = {"+", "-", "*", "/", "=", "==", "!=", "<", ">", "<=", ">=", "++", "--", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>=", "&&", "||", "!", "~", "&", "|", "^", "<<", ">>"};
for (string op : operators) {
if (s == op) {
return true;
}
}
return false;
}
bool is_delimiter(string s) {
vector<string> delimiters = {".", ",", ";", ":", "{", "}", "[", "]", "(", ")"};
for (string delimiter : delimiters) {
if (s == delimiter) {
return true;
}
}
return false;
}
bool is_literal(string s) {
if (s.empty()) {
return false;
}
if (s[0] == '"' || s[0] == '\'') {
return s.back() == s[0];
}
for (char c : s) {
if (!isdigit(c) && c != '.') {
return false;
}
}
return true;
}
TokenType get_token_type(string s) {
if (is_keyword(s)) {
return KEYWORD;
}
if (is_operator(s)) {
return OPERATOR;
}
if (is_delimiter(s)) {
return DELIMITER;
}
if (is_literal(s)) {
return LITERAL;
}
if (isalpha(s[0]) || s[0] == '_') {
for (char c : s) {
if (!isalnum(c) && c != '_') {
return UNKNOWN;
}
}
return IDENTIFIER;
}
return UNKNOWN;
}
我刚接触C++,所以请不要抱怨我上面说的东西。我感谢你的任何回答。
请不要复杂,我听不懂。如果您打算向我建议使用 GNU 或其他差异,我仍然会对此表示赞赏,但它不会对我有用。