Update README.md
This commit is contained in:
@@ -5,27 +5,29 @@
|
||||
using namespace std;
|
||||
|
||||
vector<Token> Tokenizer::run(const string& expr) {
|
||||
expression = expr;
|
||||
pos = 0;
|
||||
vector<Token> tokens;
|
||||
|
||||
expression = expr;
|
||||
pos = 0;
|
||||
vector<Token> tokens;
|
||||
|
||||
// <20><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʽ
|
||||
while (pos < expression.length()) {
|
||||
|
||||
skipWhitespace();// <20><><EFBFBD><EFBFBD><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD>
|
||||
if (pos >= expression.length()) break;
|
||||
|
||||
char current = expression[pos];
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>һԪ<D2BB><D4AA><EFBFBD>ſ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (is_dig(current) || (current == '-' && is_UMC(tokens)))
|
||||
if (is_dig(current) || (current == '-' && is_UMC(tokens)))
|
||||
tokens.push_back(readNumber());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
else if (is_let(current))
|
||||
else if (is_let(current))
|
||||
tokens.push_back(readIdentifier());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
else
|
||||
else
|
||||
tokens.push_back(readOperatorOrParen());
|
||||
}
|
||||
|
||||
@@ -69,13 +71,18 @@ Token Tokenizer::readIdentifier() {
|
||||
|
||||
//ʶ<><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
skipWhitespace();
|
||||
if (pos < expression.length() && expression[pos] == '(')
|
||||
if (pos < expression.length() && expression[pos] == '(')
|
||||
return Token(TokenType::Function, name);
|
||||
else
|
||||
else
|
||||
return Token(TokenType::Variable, name);
|
||||
}
|
||||
|
||||
Token Tokenizer::readOperatorOrParen() {
|
||||
if (expression[pos] == '/' && pos + 1 < expression.length() && expression[pos + 1] == '/') {
|
||||
pos += 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>
|
||||
return Token(TokenType::Operator, "//", 2, Associativity::Left);
|
||||
}
|
||||
|
||||
char c = expression[pos++]; // <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
|
||||
// <20>ж<EFBFBD><D0B6>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ Token
|
||||
@@ -84,7 +91,9 @@ Token Tokenizer::readOperatorOrParen() {
|
||||
case '-': return Token(TokenType::Operator, "-", 1, Associativity::Left);
|
||||
case '*': return Token(TokenType::Operator, "*", 2, Associativity::Left);
|
||||
case '/': return Token(TokenType::Operator, "/", 2, Associativity::Left);
|
||||
case '%': return Token(TokenType::Operator, "%", 2, Associativity::Left);
|
||||
case '^': return Token(TokenType::Operator, "^", 3, Associativity::Right);
|
||||
case '!': return Token(TokenType::Operator, "!", 4, Associativity::Right);
|
||||
case '(': return Token(TokenType::LeftParen, "(");
|
||||
case ')': return Token(TokenType::RightParen, ")");
|
||||
default:
|
||||
@@ -111,5 +120,5 @@ bool Tokenizer::is_let(char c) const {
|
||||
|
||||
bool Tokenizer::is_OpeCh(char c) const {
|
||||
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
||||
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^';
|
||||
}
|
||||
return c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '%';
|
||||
}
|
||||
Reference in New Issue
Block a user