Remove AST analysis dependency
This commit is contained in:
parent
a8546755af
commit
b47091527e
@ -48,15 +48,6 @@ bool is_arithmetic_type(Type type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Type string_to_type(string s, CodePosition pos) {
|
|
||||||
if (s == "int")
|
|
||||||
return Type::Int;
|
|
||||||
if (s == "double")
|
|
||||||
return Type::Double;
|
|
||||||
|
|
||||||
throw TypeError("Unknown type", pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
AnalysisResult analyze(Node &ast, Memory &memory) {
|
AnalysisResult analyze(Node &ast, Memory &memory) {
|
||||||
if (holds_alternative<Token>(ast)) {
|
if (holds_alternative<Token>(ast)) {
|
||||||
Token token = get<Token>(ast);
|
Token token = get<Token>(ast);
|
||||||
|
@ -12,7 +12,7 @@ using namespace std;
|
|||||||
/**
|
/**
|
||||||
* Tokens definition
|
* Tokens definition
|
||||||
*/
|
*/
|
||||||
enum class TokenType { Type, Identifier, Litteral, Plus, Minus, DoublePlus, DoubleMinus, DoubleEqual, Land, Lor, Lt, Gt, Leq, Geq, NotEqual, Not, Star, Slash, Percent, Equal, Semicolon, LParenthese, RParenthese, LCurlyBracket, RCurlyBracket, If, Else, While, For, Comma };
|
enum class TokenType { Identifier, Litteral, Plus, Minus, DoublePlus, DoubleMinus, DoubleEqual, Land, Lor, Lt, Gt, Leq, Geq, NotEqual, Not, Star, Slash, Percent, Equal, Semicolon, LParenthese, RParenthese, LCurlyBracket, RCurlyBracket, If, Else, While, For, Comma };
|
||||||
enum class Type { Int, Double };
|
enum class Type { Int, Double };
|
||||||
|
|
||||||
using TokenData = variant<int, double, string, Type>;
|
using TokenData = variant<int, double, string, Type>;
|
||||||
|
@ -9,4 +9,9 @@ using namespace std;
|
|||||||
*/
|
*/
|
||||||
CodePosition get_node_pos(Node node);
|
CodePosition get_node_pos(Node node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Type associated with a type name
|
||||||
|
*/
|
||||||
|
Type string_to_type(string type_name);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -4,6 +4,7 @@
|
|||||||
#include "include/parser.h"
|
#include "include/parser.h"
|
||||||
#include "include/interpreter.h"
|
#include "include/interpreter.h"
|
||||||
#include "include/memory.h"
|
#include "include/memory.h"
|
||||||
|
#include "include/utils.h"
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
bool bool_cast(EvalResult value) {
|
bool bool_cast(EvalResult value) {
|
||||||
@ -253,21 +254,23 @@ EvalResult eval(Node &ast, Memory &memory) {
|
|||||||
case NodeType::Declaration: {
|
case NodeType::Declaration: {
|
||||||
Token typeTok = get<Token>(node.children[0]);
|
Token typeTok = get<Token>(node.children[0]);
|
||||||
Token identifierTok = get<Token>(node.children[1]);
|
Token identifierTok = get<Token>(node.children[1]);
|
||||||
Type type = get<Type>(typeTok.data);
|
string typeName = get<string>(typeTok.data);
|
||||||
string identifier = get<string>(identifierTok.data);
|
string identifier = get<string>(identifierTok.data);
|
||||||
|
|
||||||
memory.declare(identifier, type);
|
memory.declare(identifier, string_to_type(typeName));
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
} break;
|
} break;
|
||||||
case NodeType::AssignedDeclaration: {
|
case NodeType::AssignedDeclaration: {
|
||||||
Token typeTok = get<Token>(node.children[0]);
|
Token typeTok = get<Token>(node.children[0]);
|
||||||
Token identifierTok = get<Token>(node.children[1]);
|
Token identifierTok = get<Token>(node.children[1]);
|
||||||
Type type = get<Type>(typeTok.data);
|
string typeName = get<string>(typeTok.data);
|
||||||
string identifier = get<string>(identifierTok.data);
|
string identifier = get<string>(identifierTok.data);
|
||||||
EvalResult value = eval(node.children[2], memory);
|
EvalResult value = eval(node.children[2], memory);
|
||||||
|
|
||||||
|
Type type = string_to_type(typeName);
|
||||||
memory.declare(identifier, type);
|
memory.declare(identifier, type);
|
||||||
|
|
||||||
if (type == Type::Int) {
|
if (type == Type::Int) {
|
||||||
memory.update(identifier, int_cast(value));
|
memory.update(identifier, int_cast(value));
|
||||||
}
|
}
|
||||||
|
@ -94,9 +94,6 @@ void _debug_print_token(Token token) {
|
|||||||
case TokenType::Identifier:
|
case TokenType::Identifier:
|
||||||
cout << "Identifier(" << get<string>(token.data) << ")";
|
cout << "Identifier(" << get<string>(token.data) << ")";
|
||||||
break;
|
break;
|
||||||
case TokenType::Type:
|
|
||||||
cout << "Type("+_debug_get_type_name(get<Type>(token.data))+")";
|
|
||||||
break;
|
|
||||||
case TokenType::Plus:
|
case TokenType::Plus:
|
||||||
cout << "+";
|
cout << "+";
|
||||||
break;
|
break;
|
||||||
|
@ -5,3 +5,12 @@ CodePosition get_node_pos(Node node) {
|
|||||||
return get<InnerNode>(node).pos;
|
return get<InnerNode>(node).pos;
|
||||||
return get<Token>(node).pos;
|
return get<Token>(node).pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Type string_to_type(string type_name) {
|
||||||
|
if (type_name == "int")
|
||||||
|
return Type::Int;
|
||||||
|
if (type_name == "double")
|
||||||
|
return Type::Double;
|
||||||
|
|
||||||
|
throw;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user