Parser: Renaming grammar symbols

This commit is contained in:
augustin64 2023-11-23 11:37:03 +01:00
parent fc7b3d440a
commit b7dcca2d47
3 changed files with 55 additions and 37 deletions

View File

@ -55,19 +55,29 @@ ParseReturn parse_expr_statement(vector<Token> tokens);
ParseReturn parse_expr(vector<Token> tokens); ParseReturn parse_expr(vector<Token> tokens);
/** /**
* Parse something derivated from T * Parse something derivated from Comp
*/ */
ParseReturn parse_t(vector<Token> tokens); ParseReturn parse_comp(vector<Token> tokens);
/** /**
* Parse something derivated from U * Parse something derivated from Sum
*/ */
ParseReturn parse_u(vector<Token> tokens); ParseReturn parse_sum(vector<Token> tokens);
/** /**
* Parse something derivated from F * Parse something derivated from Term
*/ */
ParseReturn parse_f(vector<Token> tokens); ParseReturn parse_term(vector<Token> tokens);
/**
* Parse something derivated from Unary
*/
ParseReturn parse_unary(vector<Token> tokens);
/**
* Parse something derivated from Val
*/
ParseReturn parse_val(vector<Token> tokens);
/** /**
* Parse something derivated from ParIdentifier * Parse something derivated from ParIdentifier

View File

@ -99,13 +99,13 @@ enum class NodeType {
Epsilon, // -> ; Epsilon, // -> ;
AssignedDeclaration, // -> Type Identifier = Expr AssignedDeclaration, // -> Type Identifier = Expr
Declaration, // -> Type Identifier Declaration, // -> Type Identifier
Plus, // -> T + Expr Plus, // -> Term + Sum
Minus, // -> T - Expr Minus, // -> Term - Sum
Mult, // -> F * T Mult, // -> Unary * Term
Div, // -> F / T Div, // -> Unary / Term
Mod, // -> F % T Mod, // -> Unary % Term
UnaryMinus, // -> -F UnaryMinus, // -> -Unary
UnaryPlus, // -> +F UnaryPlus, // -> +Unary
Assignment, // -> Identifier = Expr Assignment, // -> Identifier = Expr
LIncr, // -> ++ParIdentifier LIncr, // -> ++ParIdentifier
RIncr, // -> ParIdentifier++ RIncr, // -> ParIdentifier++

View File

@ -326,11 +326,19 @@ ParseReturn parse_expr_statement(vector<Token> tokens) {
} }
ParseReturn parse_expr(vector<Token> tokens) { ParseReturn parse_expr(vector<Token> tokens) {
return parse_comp(tokens);
}
ParseReturn parse_comp(vector<Token> tokens) {
return parse_sum(tokens);
}
ParseReturn parse_sum(vector<Token> tokens) {
if (tokens.size() == 0) if (tokens.size() == 0)
throw ParseException(); throw ParseException();
// At least 1 T // At least 1 Term
ParseReturn ret = parse_t(tokens); ParseReturn ret = parse_term(tokens);
tokens = ret.tokens; tokens = ret.tokens;
Node node = ret.node; Node node = ret.node;
@ -358,7 +366,7 @@ ParseReturn parse_expr(vector<Token> tokens) {
last_token = tokens.back(); last_token = tokens.back();
tokens.pop_back(); tokens.pop_back();
ParseReturn ret = parse_t(tokens); ParseReturn ret = parse_term(tokens);
tokens = ret.tokens; tokens = ret.tokens;
InnerNode new_node = { InnerNode new_node = {
@ -382,13 +390,13 @@ ParseReturn parse_expr(vector<Token> tokens) {
}; };
} }
ParseReturn parse_t(vector<Token> tokens) { ParseReturn parse_term(vector<Token> tokens) {
if (tokens.size() == 0) if (tokens.size() == 0)
throw ParseException(); throw ParseException();
// At least 1 U // At least 1 Unary
ParseReturn ret = parse_u(tokens); ParseReturn ret = parse_unary(tokens);
tokens = ret.tokens; tokens = ret.tokens;
Node node = ret.node; Node node = ret.node;
@ -419,7 +427,7 @@ ParseReturn parse_t(vector<Token> tokens) {
try { try {
last_token = tokens.back(); last_token = tokens.back();
tokens.pop_back(); tokens.pop_back();
ParseReturn ret = parse_u(tokens); ParseReturn ret = parse_unary(tokens);
tokens = ret.tokens; tokens = ret.tokens;
InnerNode new_node = { InnerNode new_node = {
@ -443,11 +451,11 @@ ParseReturn parse_t(vector<Token> tokens) {
}; };
} }
ParseReturn parse_u(vector<Token> tokens) { ParseReturn parse_unary(vector<Token> tokens) {
if (tokens.size() > 0 && tokens.back().type == TokenType::Minus) { //* U -> - U if (tokens.size() > 0 && tokens.back().type == TokenType::Minus) { //* Unary -> - Unary
tokens.pop_back(); tokens.pop_back();
ParseReturn ret = parse_u(tokens); ParseReturn ret = parse_unary(tokens);
InnerNode node = { InnerNode node = {
.type=NodeType::UnaryMinus, .type=NodeType::UnaryMinus,
@ -460,10 +468,10 @@ ParseReturn parse_u(vector<Token> tokens) {
}; };
} }
if (tokens.size() > 0 && tokens.back().type == TokenType::Plus) { //* U -> + U if (tokens.size() > 0 && tokens.back().type == TokenType::Plus) { //* Unary -> + Unary
tokens.pop_back(); tokens.pop_back();
ParseReturn ret = parse_u(tokens); ParseReturn ret = parse_unary(tokens);
InnerNode node = { InnerNode node = {
.type=NodeType::UnaryPlus, .type=NodeType::UnaryPlus,
@ -476,16 +484,16 @@ ParseReturn parse_u(vector<Token> tokens) {
}; };
} }
//* U -> F //* Unary -> Val
return parse_f(tokens); return parse_val(tokens);
} }
ParseReturn parse_f(vector<Token> tokens) { ParseReturn parse_val(vector<Token> tokens) {
if (tokens.size() == 0) if (tokens.size() == 0)
throw ParseException(); throw ParseException();
switch (tokens.back().type) { switch (tokens.back().type) {
case TokenType::Int: { //* F -> Number case TokenType::Int: { //* Val -> Number
Token number = tokens.back(); Token number = tokens.back();
tokens.pop_back(); tokens.pop_back();
return { return {
@ -493,7 +501,7 @@ ParseReturn parse_f(vector<Token> tokens) {
.tokens=tokens .tokens=tokens
};; };;
} }
case TokenType::DoublePlus: { //* F -> ++ParIdentifier case TokenType::DoublePlus: { //* Val -> ++ParIdentifier
tokens.pop_back(); tokens.pop_back();
ParseReturn ret = parse_par_identifier(tokens); ParseReturn ret = parse_par_identifier(tokens);
@ -507,7 +515,7 @@ ParseReturn parse_f(vector<Token> tokens) {
.tokens=ret.tokens .tokens=ret.tokens
}; };
} }
case TokenType::DoubleMinus: { //* F -> --ParIdentifier case TokenType::DoubleMinus: { //* Val -> --ParIdentifier
tokens.pop_back(); tokens.pop_back();
ParseReturn ret = parse_par_identifier(tokens); ParseReturn ret = parse_par_identifier(tokens);
@ -522,12 +530,12 @@ ParseReturn parse_f(vector<Token> tokens) {
}; };
} }
default: { default: {
try { //* F -> ParIdentifier... try { //* Val -> ParIdentifier...
ParseReturn ret = parse_par_identifier(tokens); ParseReturn ret = parse_par_identifier(tokens);
if (ret.tokens.size() >= 1) { if (ret.tokens.size() >= 1) {
switch (ret.tokens.back().type){ switch (ret.tokens.back().type){
case TokenType::DoublePlus: { //* F -> ParIdentifier++ case TokenType::DoublePlus: { //* Val -> ParIdentifier++
ret.tokens.pop_back(); ret.tokens.pop_back();
InnerNode node = { InnerNode node = {
.type = NodeType::RIncr, .type = NodeType::RIncr,
@ -539,7 +547,7 @@ ParseReturn parse_f(vector<Token> tokens) {
.tokens=ret.tokens .tokens=ret.tokens
}; };
} }
case TokenType::DoubleMinus: { //* F -> ParIdentifier-- case TokenType::DoubleMinus: { //* Val -> ParIdentifier--
ret.tokens.pop_back(); ret.tokens.pop_back();
InnerNode node = { InnerNode node = {
.type = NodeType::RDecr, .type = NodeType::RDecr,
@ -551,7 +559,7 @@ ParseReturn parse_f(vector<Token> tokens) {
.tokens=ret.tokens .tokens=ret.tokens
}; };
} }
case TokenType::Equal: { //* F -> ParIdentifier = (Expr) case TokenType::Equal: { //* Val -> ParIdentifier = (Expr)
ret.tokens.pop_back(); ret.tokens.pop_back();
ParseReturn ret_expr = parse_expr(ret.tokens); ParseReturn ret_expr = parse_expr(ret.tokens);
@ -569,10 +577,10 @@ ParseReturn parse_f(vector<Token> tokens) {
break; break;
} }
} }
//* F -> ParIdentifier //* Val -> ParIdentifier
return ret; return ret;
} catch (const ParseException& pex) { //* F -> (Expr) } catch (const ParseException& pex) { //* Val -> (Expr)
if (tokens.back().type != TokenType::LParenthese) if (tokens.back().type != TokenType::LParenthese)
throw ParseException(); throw ParseException();