s4g  0.9.2
высокоуровневый, императивный, процедурный, встраиваемый, скриптовый язык программирования общего назначения, написанный на C++.
s4g_parser.h
См. документацию.
1 
2 /*
3 Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
4 license MIT see in LICENSE or
5 https://s4g.su/
6 */
7 
13 #ifndef s4g_parser_h
14 #define s4g_parser_h
15 
16 #include "s4g_types.h"
17 #include "s4g_parse.h"
18 #include "s4g_main.h"
19 
22 {
23  PARSER_NODE__NULL,
26 
28  //PARSER_NODE_CLASS_VAR,
29 
43  //PARSER_NODE_LISTID, //!<
44  //PARSER_NODE_CLASS_KW,
48 
49  //PARSER_NODE_ID,
50 
53 
57 
59 
65 
68 
69 };
70 
71 class s4g_Parser
72 {
73 public:
74  int parse(s4g_Lexer *pLexer);
75 
76  bool matchRVal();
77  bool matchLVal();
78 
79  bool matchClass();
80  bool matchClassVar();
81  bool matchListID();
82  bool matchID();
83  bool matchExpr();
84  bool matchArray();
85  bool matchTable();
86  bool matchStatement();
87  bool matchReturn();
88  bool matchFunctionKW();
89  bool matchFunction();
90  bool matchFunctionDeclArg();
91  bool matchFunctionDecl();
92  bool matchFunctionExternKW();
93  bool matchFunctionExternArg();
94  bool matchCycleControl();
95  bool matchBlock();
96  bool matchIfKW();
97  bool matchWhileKW();
98  bool matchForKW();
99  bool matchDoKW();
100  bool matchClassKW();
101  bool matchClassExtendsKW();
102  bool matchClassExtendsArg();
103 
104  bool isConst(S4G_LEXEME_TYPE type, ID idWord);
105  bool isOp2(S4G_LEXEME_TYPE type);
106  bool isOpLeft(S4G_LEXEME_TYPE type, ID idWord);
107  bool isOpRight(S4G_LEXEME_TYPE type, ID idWord);
108  bool isSkipReduce(S4G_LEXEME_TYPE type, ID idWord);
109  bool isAssign(S4G_LEXEME_TYPE type, ID idWord);
110  void stepBack();
111  void skipNext();
112  void repeat();
113  void error(s4g_Lexeme *pLexeme, const char * szMsg);
114  void reportError();
115  void resolveExpressions();
116  static bool resolveExpressionsCB(s4g_BaseNode **ppNode);
117 
118  void traverseTree(bool(*pfnCallback)(s4g_BaseNode **ppNode), s4g_BaseNode **ppStartNode=NULL);
119 
120  static s4g_OpNode *getOpNode(s4g_Lexeme *pLexeme);
121 
122  void debugDump();
123 
124  void delSubtree(s4g_BaseNode *pRootNode=NULL);
125 
126  s4g_BaseNode *getRoot();
127 
128  void clear();
129 
130  struct TempNode
131  {
132  TempNode():
133  m_pLex(NULL),
134  m_node(PARSER_NODE__NULL),
135  m_pASTnode(NULL)
136  {}
137  TempNode(s4g_Lexeme *pLex):
138  m_pLex(pLex),
139  m_node(PARSER_NODE__LEX),
140  m_pASTnode(NULL)
141  {}
142  TempNode(PARSER_NODE node, s4g_BaseNode *pASTnode):
143  m_pLex(NULL),
144  m_node(node),
145  m_pASTnode(pASTnode)
146  {}
147  s4g_Lexeme * m_pLex;
148  PARSER_NODE m_node;
149  s4g_BaseNode *m_pASTnode;
150 
151  bool operator==(const TempNode &other) const
152  {
153  if(m_node != other.m_node)
154  {
155  return(false);
156  }
157  if(m_node == PARSER_NODE__LEX)
158  {
159  return(m_pLex->m_type == other.m_pLex->m_type
160  &&m_pLex->m_idWord == other.m_pLex->m_idWord);
161  }
162  return(true);
163  }
164  bool operator<(const TempNode &other) const
165  {
166  if(m_node != other.m_node)
167  {
168  return(m_node < other.m_node);
169  }
170  if(m_node == PARSER_NODE__LEX)
171  {
172  if(m_pLex->m_type != other.m_pLex->m_type)
173  {
174  return(m_pLex->m_type < other.m_pLex->m_type);
175  }
176  return(m_pLex->m_idWord < other.m_pLex->m_idWord);
177  }
178  return(false);
179  }
180  };
181 
182 
183  void putNode(TempNode node, int iReplace = 1);
184  void error(TempNode *pNode, const char * szMsg);
185 
186  s4g_Lexeme *findLeftmostLexeme(TempNode *pNode);
187  s4g_Lexeme *findLeftmostLexeme(s4g_BaseNode *pNode);
188 
189  s4g_Stack<s4g_BaseNode*> m_stDelList;
190 
191 protected:
192  s4g_Lexer *m_pLexer;
193 
194  s4g_Stack<TempNode> m_stNodes;
195 
196  int m_iBackSteps;
197  int m_iRepeatSteps;
198  int m_iSkipSteps;
199  bool m_isError;
200  TempNode m_nextNode;
201 
202  int m_iErrorCount;
203 
204  static bool delSubtreeCB(s4g_BaseNode **ppNode);
205  static s4g_Lexeme *m_pLeftmostLexemeFounded;
206  static bool findLeftmostLexemeCB(s4g_BaseNode **ppNode);
207 };
208 
209 #endif
базовый класс нода АСТ
Definition: s4g_parse.h:568
Инструкция
Definition: s4g_parser.h:62
Заголовочный файл с основными типами и данными для парсинга кода
Аргумент для extern.
Definition: s4g_parser.h:36
Аргумент обьявления функции
Definition: s4g_parser.h:34
Заголовок для FOR.
Definition: s4g_parser.h:42
S4G_LEXEME_TYPE m_type
тип лексемы
Definition: s4g_parse.h:351
Оператор возврата
Definition: s4g_parser.h:63
Заголовок класса
Definition: s4g_parser.h:45
Выражение
Definition: s4g_parser.h:60
Символ мультиаргумента
Definition: s4g_parser.h:35
PARSER_NODE
Промежуточные синтаксические ноды
Definition: s4g_parser.h:21
Заголовочный файл основы взаимодествия хоста со скриптами
Завершенное обьявление переменной
Definition: s4g_parser.h:55
Стек, а точнее простой динамический массив с элементами стека
Definition: s4g_stack.h:22
Инструкция
Definition: s4g_parser.h:61
лексема
Definition: s4g_parse.h:342
Обьявление переменной
Definition: s4g_parser.h:54
Заголовок для WHILE.
Definition: s4g_parser.h:40
DO.
Definition: s4g_parser.h:66
Функция
Definition: s4g_parser.h:30
Аргумент для extends класса
Definition: s4g_parser.h:47
Таблица
Definition: s4g_parser.h:58
вся программа
Definition: s4g_parser.h:25
Ключевое слово function.
Definition: s4g_parser.h:32
Левое значение (в него можно присваивать)
Definition: s4g_parser.h:52
ключевое слово extern.
Definition: s4g_parser.h:33
лексический анализатор
Definition: s4g_lexer.h:99
S4G_LEXEME_TYPE
типы лексем
Definition: s4g_parse.h:319
Класс
Definition: s4g_parser.h:27
Нода содержит лексему, в противном случае часть поддерева AST.
Definition: s4g_parser.h:24
Оператор управления циклом
Definition: s4g_parser.h:64
Ключевое слово extends класса
Definition: s4g_parser.h:46
Заголовок для IF.
Definition: s4g_parser.h:38
ID m_idWord
порядковый номер лексемы из массива слов к которому она относится
Definition: s4g_parse.h:352
Заголовок функции
Definition: s4g_parser.h:31
Правое значение (в него нельзя присваивать)
Definition: s4g_parser.h:51
DO.
Definition: s4g_parser.h:67
Условие IF.
Definition: s4g_parser.h:37
Блок
Definition: s4g_parser.h:56
Заголовочный файл с основными типами данных
Цикл WHILE.
Definition: s4g_parser.h:39
Цикл FOR.
Definition: s4g_parser.h:41