2022-08-19 19:52:57 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <optional>
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
#include "bolt/CST.hpp"
|
|
|
|
|
|
|
|
namespace bolt {
|
|
|
|
|
|
|
|
class Scanner;
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
enum OperatorFlags {
|
|
|
|
OperatorFlags_Prefix = 1,
|
|
|
|
OperatorFlags_Suffix = 2,
|
|
|
|
OperatorFlags_InfixL = 4,
|
|
|
|
OperatorFlags_InfixR = 8,
|
|
|
|
};
|
|
|
|
|
|
|
|
struct OperatorInfo {
|
|
|
|
|
|
|
|
int Precedence;
|
|
|
|
unsigned Flags;
|
|
|
|
|
|
|
|
inline bool isPrefix() const noexcept {
|
|
|
|
return Flags & OperatorFlags_Prefix;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool isSuffix() const noexcept {
|
|
|
|
return Flags & OperatorFlags_Suffix;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool isInfix() const noexcept {
|
|
|
|
return Flags & (OperatorFlags_InfixL | OperatorFlags_InfixR);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool isRightAssoc() const noexcept {
|
|
|
|
return Flags & OperatorFlags_InfixR;
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
class OperatorTable {
|
|
|
|
|
|
|
|
std::unordered_map<std::string, OperatorInfo> Mapping;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
void add(std::string Name, unsigned Flags, int Precedence);
|
|
|
|
|
|
|
|
std::optional<OperatorInfo> getInfix(Token* T);
|
|
|
|
|
|
|
|
bool isInfix(Token* T);
|
|
|
|
|
|
|
|
bool isPrefix(Token* T);
|
|
|
|
|
|
|
|
bool isSuffix(Token* T);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
class Parser {
|
|
|
|
|
2022-08-24 12:36:43 +02:00
|
|
|
TextFile& File;
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
Stream<Token*>& Tokens;
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
OperatorTable ExprOperators;
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
Token* peekFirstTokenAfterModifiers();
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
Expression* parseInfixOperatorAfterExpression(Expression* LHS, int MinPrecedence);
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
public:
|
|
|
|
|
2022-08-24 12:36:43 +02:00
|
|
|
Parser(TextFile& File, Stream<Token*>& S);
|
2022-08-19 19:52:57 +02:00
|
|
|
|
|
|
|
QualifiedName* parseQualifiedName();
|
|
|
|
|
|
|
|
TypeExpression* parseTypeExpression();
|
|
|
|
|
|
|
|
Pattern* parsePattern();
|
|
|
|
|
|
|
|
Param* parseParam();
|
|
|
|
|
|
|
|
ReferenceExpression* parseReferenceExpression();
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
Expression* parseUnaryExpression();
|
|
|
|
|
|
|
|
Expression* parsePrimitiveExpression();
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
Expression* parseExpression();
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
Expression* parseCallExpression();
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
ExpressionStatement* parseExpressionStatement();
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
Node* parseLetBodyElement();
|
2022-08-19 19:52:57 +02:00
|
|
|
|
|
|
|
LetDeclaration* parseLetDeclaration();
|
|
|
|
|
2022-08-21 16:25:52 +02:00
|
|
|
Node* parseSourceElement();
|
2022-08-19 19:52:57 +02:00
|
|
|
|
|
|
|
SourceFile* parseSourceFile();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|