-
Notifications
You must be signed in to change notification settings - Fork 0
/
LLtable.h
125 lines (92 loc) · 2.66 KB
/
LLtable.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**
* @file LLTable.c
* @author Antonín Jarolím ([email protected])
* @author Jakub Vlk ([email protected])
* @brief Table containing all rules
* Implementation IFJ22 compiler
*/
#ifndef LUAINTERPRET_LLTABLE_H
#define LUAINTERPRET_LLTABLE_H
#include "common.h"
#include "lex.h"
#include "semanticActionInfo.h"
#define MAX_RULE_LEN 15
#define MAX_RULES_IN_CELL 15
#define AddToRightSide(terminal, nonterminal, countOfRule, member, ruleIndex) \
Table[nonTerminal][terminal]->rules[ruleIndex]->to[countOfRule] = member;
#define partOfRulesRightSide(name) createPSAStackMember(name, getDataType(#name))
typedef enum {
// S - initial state
ProgramBody,
// Command
Command,
// Function definitions
FceDefine,
FceHeader,
FunctionDeclareParams,
CommaOrEpsParams,
DeclareParam,
// FuncReturnType
FuncReturnColonType,
// Function call
FceCall,
FirstFceParam,
CommaOrEpsParam,
// Exp
Exp,
Statement,
// Data types DataType
DataType,
// Variable definitions
DeclareVariable,
DefVarAss,
// Conditions
Condition,
ElseCond,
// While
While,
// Return
Return,
ReturnExp,
// Vnítřek funkce
FunctionBody,
nonTerminalCount
} nonTerminalType;
// Ll table
typedef enum PSADataType {
endOfFile,// special token to detect end of stack
terminal,
nonTerminal
} PSADataType;
typedef struct PSAStackMember {
int data;
PSADataType type;
} PSAStackMember;
typedef struct rule {
int id;
bool epsRule;
void (*semanticAction)(semanticActionInfo);
nonTerminalType from;
PSAStackMember *to[MAX_RULE_LEN];
} rule;
typedef struct tableMember {
rule *rules[MAX_RULES_IN_CELL];
nonTerminalType nonTerminal;
lexType terminal;
} tableMember;
typedef tableMember *table[(int) nonTerminalCount][(int) lexTypeCount];
tableMember *getLLMember(nonTerminalType nonterm, lexType terminal);
void createLLTable();
rule *findRuleByHandle(PSAStackMember *handleToFind[MAX_RULE_LEN]);
PSAStackMember *createPSAStackMember(int value, PSADataType type);
char *getStringPSAMember(PSAStackMember m);
void setSemanticActionAllRules(nonTerminalType nonTerminal,
void (*semanticAction)(semanticActionInfo));
void setSemanticAction(nonTerminalType nonTerminal,
lexType terminal,
void (*semanticAction)(semanticActionInfo));
void setSemanticActionRow(nonTerminalType nonTerminal,
void (*semanticAction)(semanticActionInfo),
size_t except,
...);
#endif//LUAINTERPRET_LLTABLE_H