-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParser.h
69 lines (64 loc) · 3.1 KB
/
Parser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#pragma once
#include <vector>
#include <functional>
class Token;
class Expression;
class Statement;
class Parser
{
private:
/// Token lista iterátorja
std::vector<Token*>::const_iterator tokensIt;
/// Parser hiba esetén meghívott callback (Hibaüzenet, Hibás sor, Hibás oszlop)
std::function<void(std::string, int, int)> errorCallback;
public:
/// @ tokenIt Token lista iterátorja
/// @note Minden Token listához külön Tokenizer példány kell
/// @param errorCallback Parser hiba esetén meghívott callback (Hibaüzenet, Hibás sor, Hibás oszlop)
Parser(std::vector<Token*>::const_iterator tokensIt, std::function<void(std::string, int, int)> errorCallback);
/// Feldolgozza a következő parancsot/állítást
Statement* parseStatement();
private:
/// Feldolgozza a következő kifejezést
Expression * parseExpression();
/// Feldolgozza a következő ConditionalExpression-t vagy átadja a feldolgozást a parseOrExpression-nek
/// @param ternaryCalls Ha rekurzívan parseoljuk a feltételes kifejezést, akkor lehet az elején ':', amúgy nem
Expression * parseConditionalExpression(bool ternaryCalls);
/// Feldolgozza a következő OrExpression-t vagy átadja a feldolgozást a parseAndExpression-nek
Expression* parseOrExpression();
/// Feldolgozza a következő AndExpression-t vagy átadja a feldolgozást a parseRelationalExpression-nek
Expression* parseAndExpression();
/// Feldolgozza a következő RelationalExpression-t vagy átadja a feldolgozást a parseAddSubExpression-nek
Expression* parseRelationalExpression();
/// Feldolgozza a következő AddExpression-t vagy SubExpressiont-t vagy átadja a feldolgozást a parseMulDivModExpression-nek
Expression* parseAddSubExpression();
/// Feldolgozza a következő MulExpression-t, DivExpression-t vagy ModExpressiont-t
/// vagy átadja a feldolgozást a parsePowExpression-nek
Expression* parseMulDivModExpression();
/// Feldolgozza a következő PowExpression-t vagy átadja a feldolgozást a parseUnaryExpression-nek
Expression* parsePowExpression();
/// Feldolgozza a következő UnaryExpression-t vagy átadja a feldolgozást a parseFunctionCallExpression-nek
Expression* parseUnaryExpression();
/// Feldolgozza a következő FunctionCallExpression-t vagy átadja a feldolgozást a parseBaseExpression-nek
Expression* parseFunctionCallExpression();
/// Feldolgozza a következő zárójeles kifejezést
Expression* parseParanthesesExpression();
/// Feldolgozza a következő literált vagy zárójeles kifejezést
/// @note Hiba esetén Expected expression hibaüzenetet dob
Expression* parseBaseExpression();
/// Megmondja végére értünk-e a feldolgozott Token sorozatnak
bool isOver();
/// Visszaadja a jelenleg feldolgozott Token-t
Token* currentToken();
/// Visszaadja a jelenleg feldolgozott Token-t, majd lép egyet
Token* nextToken();
/// Visszalépteti az iterátort
/// @param by Ennyit léptet vissza
void rollBack(int by);
/// Visszaadja a jelenleg feldolgozott Token kezdő sorát
/// @see Token::line
int currentLine();
/// Visszaadja a jelenleg feldolgozott Token kezdő sorát
/// @see Token::column
int currentColumn();
};