s4g  0.9.2
высокоуровневый, императивный, процедурный, встраиваемый, скриптовый язык программирования общего назначения, написанный на C++.
s4g_parse.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_PARSE_H
14 #define __S4G_PARSE_H
15 
16 #define S4G_MAX_LEN_KEY_WORD_DEF 10
17 //#define S4G_MAX_LEN_SYM 4
18 
19 #include "s4g_types.h"
20 
22 const char g_aKeywordsLang[][S4G_MAX_LEN_KEY_WORD_DEF] =
23 {
24  "null",
25  "function",
26  "return",
27  "extern",
28  "if",
29  "else",
30  "for",
31  "while",
32  "do",
33  "break",
34  "continue",
35  "class",
36  //"table",
37  "true",
38  "false",
39  "new",
40  "var",
41  "extends",
42 
43  // Reserved for future use
44  "static",
45  "public",
46  "private",
47  "protected",
48  "const",
49 };
50 
53 {
54  S4G_KW_LANG_NULL = 0,
55  S4G_KW_LANG_FUNCTION,
56  S4G_KW_LANG_RETURN,
57  S4G_KW_LANG_EXTERN,
58  S4G_KW_LANG_IF,
59  S4G_KW_LANG_ELSE,
60  S4G_KW_LANG_FOR,
61  S4G_KW_LANG_WHILE,
62  S4G_KW_LANG_DO,
63  S4G_KW_LANG_BREAK,
64  S4G_KW_LANG_CONTINUE,
65  S4G_KW_LANG_CLASS,
66 // S4G_KW_LANG_TABLE,
67  S4G_KW_LANG_TRUE,
68  S4G_KW_LANG_FALSE,
69  S4G_KW_LANG_NEW,
70  S4G_KW_LANG_VAR,
71  S4G_KW_LANG_EXTENDS,
72 
73  // Reserved for future use
74  S4G_KW_LANG_STATIC,
75  S4G_KW_LANG_PUBLIC,
76  S4G_KW_LANG_PRIVATE,
77  S4G_KW_LANG_PROTECTED,
78  S4G_KW_LANG_CONST,
79 };
80 
82 const char g_aKeywordsPreproc[][S4G_MAX_LEN_KEY_WORD_DEF] =
83 {
84  "include",
85  "define",
86  "undef",
87  "if",
88  "ifdef",
89  "defined",
90  "elif",
91  "else",
92  "end",
93  "line"
94 };
95 
98 {
99  S4G_KW_PP_USER = -1,
100  S4G_KW_PP_INCLUDE = 0,
101  S4G_KW_PP_DEFINE,
102  S4G_KW_PP_UNDEF,
103  S4G_KW_PP_IF,
104  S4G_KW_PP_IFDEF,
105  S4G_KW_PP_DEFINED,
106  S4G_KW_PP_ELIF,
107  S4G_KW_PP_ELSE,
108  S4G_KW_PP_END,
109  S4G_KW_PP_LINE
110 };
111 
113 const char g_aKeycharsDelimiter[][S4G_MAX_LEN_KEY_WORD_DEF] =
114 {
115  ";", //разделитель операций
116  "," //разделитель аргументов
117 };
118 
121 {
122  S4G_KC_DELIMITER_SEMICOLON = 0,
123  S4G_KC_DELIMITER_COMMA
124 };
125 
127 const char g_aKeycharsGroupExpr[][S4G_MAX_LEN_KEY_WORD_DEF] =
128 {
129  "(", //начало группировки/вызова функции
130  ")" //конец группировки/вызова функции
131 };
132 
135 {
136  S4G_KC_GROUPEXPR_BEGIN = 0,
137  S4G_KC_GROUPEXPR_END
138 };
139 
141 const char g_aKeycharsGroupData[][S4G_MAX_LEN_KEY_WORD_DEF] =
142 {
143  "{", "}",//начало конец группировки данных (создания таблицы, объявления класса)
144 };
145 
148 {
149  S4G_KC_GROUPDATA_BEGIN = 0,
150  S4G_KC_GROUPDATA_END
151 };
152 
154 const char g_aKeycharsAccess2Object[][S4G_MAX_LEN_KEY_WORD_DEF] =
155 {
156  "[", "]", //начало конец обращение к элементу таблицы, переменной или методу класса по строке
157  ".", //обращение к эпеременной или методу класса по имени
158  ":" //доступ по числовому индексу как к массиву, после следует [num]
159 };
160 
163 {
164  S4G_KC_A2O_TABLE_GETS_BEGIN = 0,
165  S4G_KC_A2O_TABLE_GETS_END,
166  S4G_KC_A2O_CLASS_GET,
167  S4G_KC_A2O_TABLE_GETN
168 };
169 
171 const char g_aKeycharsAssign[][S4G_MAX_LEN_KEY_WORD_DEF] =
172 {
173  "="
174 };
175 
178 {
179  S4G_KC_AASSIGN = 0,
180 };
181 
183 const char g_aKeycharsArithmetic[][S4G_MAX_LEN_KEY_WORD_DEF] =
184 {
185  "+",
186  "-",
187  "*",
188  "/",
189  "%",
190 };
191 
194 {
195  S4G_KC_ARITHMETIC_ADD = 0,
196  S4G_KC_ARITHMETIC_SUB,
197  S4G_KC_ARITHMETIC_MUL,
198  S4G_KC_ARITHMETIC_DIV,
199  S4G_KC_ARITHMETIC_MOD,
200 };
201 
203 const char g_aKeycharsLogic[][S4G_MAX_LEN_KEY_WORD_DEF] =
204 {
205  "&&",
206  "||",
207  "===",
208  "!==",
209  "==",
210  "!=",
211  ">=",
212  "<=",
213  ">",
214  "<",
215  "!",
216 };
217 
220 {
221  S4G_KC_LOGIC_AND = 0,
222  S4G_KC_LOGIC_OR,
223  S4G_KC_LOGIC_EQT,
224  S4G_KC_LOGIC_NEQT,
225  S4G_KC_LOGIC_EQ,
226  S4G_KC_LOGIC_NEQ,
227  S4G_KC_LOGIC_GE,
228  S4G_KC_LOGIC_LE,
229  S4G_KC_LOGIC_GT,
230  S4G_KC_LOGIC_LT,
231  S4G_KC_LOGIC_NOT
232 };
233 
235 const char g_aKeycharsBit[][S4G_MAX_LEN_KEY_WORD_DEF] =
236 {
237  "^",
238  "~",
239  ">>",
240  "<<",
241  "&",
242  "|"
243 };
244 
247 {
248  S4G_KC_BIT_XOR = 0,
249  S4G_KC_BIT_NOT,
250  S4G_KC_BIT_SHIFTR,
251  S4G_KC_BIT_SHIFTL,
252  S4G_KC_BIT_AND,
253  S4G_KC_BIT_OR
254 };
255 
257 const char g_aKeycharsAssignArithmetic[][S4G_MAX_LEN_KEY_WORD_DEF] =
258 {
259  "+=",
260  "-=",
261  "*=",
262  "/=",
263  "%=",
264  //"?=",
265  "++",
266  "--"
267 };
268 
271 {
272  S4G_KC_ASSIGN_ARITHMETIC_ADD = 0,
273  S4G_KC_ASSIGN_ARITHMETIC_SUB,
274  S4G_KC_ASSIGN_ARITHMETIC_MUL,
275  S4G_KC_ASSIGN_ARITHMETIC_DIV,
276  S4G_KC_ASSIGN_ARITHMETIC_MOD,
277  //S4G_KC_ASSIGN_ARITHMETIC_OPTSTORE,
278  S4G_KC_ASSIGN_ARITHMETIC_INCR,
279  S4G_KC_ASSIGN_ARITHMETIC_DECR
280 };
281 
283 const char g_aKeycharsAssignBit[][S4G_MAX_LEN_KEY_WORD_DEF] =
284 {
285  "^=",
286  //"~=",
287  ">>=",
288  "<<=",
289  "&=",
290  "|="
291 };
292 
295 {
296  S4G_KC_ASSIGN_BIT_XOR = 0,
297  //S4G_KC_ASSIGN_BIT_NOT,
298  S4G_KC_ASSIGN_BIT_SHIFTR,
299  S4G_KC_ASSIGN_BIT_SHIFTL,
300  S4G_KC_ASSIGN_BIT_AND,
301  S4G_KC_ASSIGN_BIT_OR
302 };
303 
304 
306 //однострочный комментарий
307 const char s4g_key_syms_comment_os[][S4G_MAX_LEN_KEY_WORD_DEF] = {
308  "//"
309 };
310 
312 //многострочный комментарий
313 const char s4g_key_syms_comment_ms[][S4G_MAX_LEN_KEY_WORD_DEF] = {
314  "/*", //начало
315  "*/" //конец
316 };
317 
320 {
339 };
340 
343 {
344  s4g_Lexeme(){}
345  s4g_Lexeme(const char *szStr, int numStr, S4G_LEXEME_TYPE type, ID idWord, ID idFile)
346  {
347  m_sLexeme = szStr; m_numStr = numStr, m_type = type; m_idWord = idWord; m_idFile = idFile;
348  }
349  String m_sLexeme;
350  int m_numStr;
352  ID m_idWord;
353  ID m_idFile;
354 };
355 
358 {
359  S4G_NODE_TYPE_BEGIN, //начало программы
360  //S4G_NODE_TYPE_EMPTY, //путой нод, соединящее звено нодов
361 
362  S4G_NODE_TYPE_EXPR, //выражение
363  S4G_NODE_TYPE_VAR, //переменная
364  S4G_NODE_TYPE_ARRAY, //массив
365  S4G_NODE_TYPE_STMT, //инструкция
366  S4G_NODE_TYPE_STMT_CHAIN, //инструкция
367  S4G_NODE_TYPE_TBL_ITEM, //
368  S4G_NODE_TYPE_ID, //Идентификатор
369  S4G_NODE_TYPE_DECLVAR, //Идентификатор
370  S4G_NODE_TYPE_DECLVAREND, //Идентификатор
371 
372  S4G_NODE_TYPE_ACCESS_DOT,
373  S4G_NODE_TYPE_ACCESS_SQUARE,
374  S4G_NODE_TYPE_ACCESS_SQUARE_NUM,
375  S4G_NODE_TYPE_ACCESS_SQUARE_APPEND,
376 
377  //пре и пост инкременты и декременты, для переменных
378  S4G_NODE_TYPE_VAR_PREINCR,
379  S4G_NODE_TYPE_VAR_PREDECR,
380  S4G_NODE_TYPE_VAR_POSTINCR,
381  S4G_NODE_TYPE_VAR_POSTDECR,
382 
383  //S4G_NODE_TYPE_CRVAR, //создаваемая переменная
384 
385  S4G_NODE_TYPE_BLOCK,//блок инструкций, создает новый контекст
386  S4G_NODE_TYPE_BLOCK_NO_CTX,//блок инструкций, не создает новый контекст
387 
388  //ноды содержащие в себе значения с типами
389  S4G_NODE_TYPE_NULL,
390  S4G_NODE_TYPE_FLOAT,
391  S4G_NODE_TYPE_INT,
392  //S4G_NODE_TYPE_INT_CR,
393  S4G_NODE_TYPE_UINT,
394  //S4G_NODE_TYPE_UINT_CR,
395  S4G_NODE_TYPE_BOOL,
396  S4G_NODE_TYPE_STRING,
397  S4G_NODE_TYPE_CONST_DATA,
398  //S4G_NODE_TYPE_STRING_CR,
399  S4G_NODE_TYPE_FUNCTION,
400  //S4G_NODE_TYPE_NNULL, //цифра 0 для выражений типа -123 = 0-123
401 
402  //нод содержит аргументы
403  //S4G_NODE_TYPE_ARG,
404  S4G_NODE_TYPE_MARG,
405 
406  //S4G_NODE_TYPE_SET, //присваивание
407  //S4G_NODE_TYPE_SETT, //присваивание в таблице
408  //S4G_NODE_TYPE_GET, //получение переменной
409 
410  // присваивание
411  S4G_NODE_TYPE_ASSIGN,
412  S4G_NODE_TYPE_ASSIGN_ADD,
413  S4G_NODE_TYPE_ASSIGN_SUB,
414  S4G_NODE_TYPE_ASSIGN_MUL,
415  S4G_NODE_TYPE_ASSIGN_DIV,
416  S4G_NODE_TYPE_ASSIGN_MOD,
417  S4G_NODE_TYPE_ASSIGN_BXOR,
418  //S4G_NODE_TYPE_ASSIGN_BNOT,
419  S4G_NODE_TYPE_ASSIGN_BRSH,
420  S4G_NODE_TYPE_ASSIGN_BLSH,
421  S4G_NODE_TYPE_ASSIGN_BAND,
422  S4G_NODE_TYPE_ASSIGN_BOR,
423 
424  //пре и пост инкременты и декременты
425  S4G_NODE_TYPE_PREINCR,
426  S4G_NODE_TYPE_PREDECR,
427  S4G_NODE_TYPE_POSTINCR,
428  S4G_NODE_TYPE_POSTDECR,
429 
430  S4G_NODE_TYPE_NEGATE,
431 
432  //S4G_NODE_TYPE_GET_CR,//создание и получение переменной
433  S4G_NODE_TYPE_CALL, //вызов функции
434  S4G_NODE_TYPE_ADD,//+
435  S4G_NODE_TYPE_SUB,//-
436  S4G_NODE_TYPE_MUL,//*
437  S4G_NODE_TYPE_DIV,
438  //S4G_NODE_TYPE_GROUP_B,//(
439  //S4G_NODE_TYPE_GROUP_E,//)
440  S4G_NODE_TYPE_RETURN, //возвращение значений
441 
442  S4G_NODE_TYPE_TABLE, //таблица
443  //S4G_NODE_TYPE_TABLE_NEW, //создание таблицы
444  //S4G_NODE_TYPE_TABLE_INSERT, //добавление в таблицу
445  //S4G_NODE_TYPE_TABLE_APPEND, //добавить в конец таблицы
446 
447  S4G_NODE_TYPE_IF,
448  S4G_NODE_TYPE_WHILE,
449  S4G_NODE_TYPE_FOR,
450  S4G_NODE_TYPE_DO,
451 
452  S4G_NODE_TYPE_MOD,
453  S4G_NODE_TYPE_BIT_AND,
454  S4G_NODE_TYPE_BIT_OR,
455  S4G_NODE_TYPE_BIT_XOR,
456  S4G_NODE_TYPE_BIT_NOT,
457  S4G_NODE_TYPE_BIT_SHIFTR,
458  S4G_NODE_TYPE_BIT_SHIFTL,
459 
460  S4G_NODE_TYPE_LOG_NOT,
461  S4G_NODE_TYPE_LOG_EQ,
462  S4G_NODE_TYPE_LOG_NEQ,
463  S4G_NODE_TYPE_LOG_GT,
464  S4G_NODE_TYPE_LOG_LT,
465  S4G_NODE_TYPE_LOG_GE,
466  S4G_NODE_TYPE_LOG_LE,
467  S4G_NODE_TYPE_LOG_NEQT,
468  S4G_NODE_TYPE_LOG_EQT,
469  S4G_NODE_TYPE_LOG_AND,
470  S4G_NODE_TYPE_LOG_OR,
471 
472  S4G_NODE_TYPE_BREAK,
473  S4G_NODE_TYPE_CONTINUE,
474 
475  S4G_NODE_TYPE_CHAIN,
476 
477  S4G_NODE_TYPE_CLASS,
478  S4G_NODE_TYPE_CLASS_VAR,
479  S4G_NODE_TYPE_NEW_OBJ,
480 };
481 
482 const S4G_NODE_TYPE s4g_aop_map[] = {
483  S4G_NODE_TYPE_ADD, //S4GLAO_ADD = 0,
484  S4G_NODE_TYPE_SUB, //S4GLAO_SUB,
485  S4G_NODE_TYPE_MUL, //S4GLAO_MUL,
486  S4G_NODE_TYPE_DIV, //S4GLAO_DIV,
487  S4G_NODE_TYPE_MOD, //S4GLAO_MOD,
488  S4G_NODE_TYPE_LOG_AND, //S4GLAO_LOG_AND,
489  S4G_NODE_TYPE_LOG_OR, //S4GLAO_LOG_OR,
490  S4G_NODE_TYPE_BIT_XOR, //S4GLAO_BIT_XOR,
491  S4G_NODE_TYPE_BIT_NOT, //S4GLAO_BIT_NOT,
492  S4G_NODE_TYPE_BIT_SHIFTR, //S4GLAO_BIT_SHIFTR,
493  S4G_NODE_TYPE_BIT_SHIFTL, //S4GLAO_BIT_SHIFTL,
494  S4G_NODE_TYPE_LOG_NEQT, //S4GLAO_LOG_NEQT,
495  S4G_NODE_TYPE_LOG_EQ, //S4GLAO_LOG_EQ,
496  S4G_NODE_TYPE_LOG_NEQ, //S4GLAO_LOG_NEQ,
497  S4G_NODE_TYPE_LOG_GE, //S4GLAO_LOG_GE,
498  S4G_NODE_TYPE_LOG_LE, //S4GLAO_LOG_LE,
499  S4G_NODE_TYPE_LOG_GT, //S4GLAO_LOG_GT,
500  S4G_NODE_TYPE_LOG_LT, //S4GLAO_LOG_LT,
501  S4G_NODE_TYPE_LOG_NOT, //S4GLAO_LOG_NOT,
502  S4G_NODE_TYPE_LOG_EQT, //S4GLAO_LOG_EQT,
503  S4G_NODE_TYPE_BIT_AND, //S4GLAO_BIT_AND,
504  S4G_NODE_TYPE_BIT_OR, //S4GLAO_BIT_OR,
505 };
506 
509 {
510  switch (op)
511  {
512  case S4G_NODE_TYPE_BIT_NOT:
513  return 32;
514 
515  case S4G_NODE_TYPE_LOG_NOT:
516  return 31;
517 
518  case S4G_NODE_TYPE_MUL:
519  case S4G_NODE_TYPE_DIV:
520  case S4G_NODE_TYPE_MOD:
521  return 30;
522 
523  case S4G_NODE_TYPE_ADD:
524  case S4G_NODE_TYPE_SUB:
525  return 20;
526 
527  case S4G_NODE_TYPE_BIT_SHIFTR:
528  case S4G_NODE_TYPE_BIT_SHIFTL:
529  return 19;
530 
531  case S4G_NODE_TYPE_LOG_GT:
532  case S4G_NODE_TYPE_LOG_GE:
533  case S4G_NODE_TYPE_LOG_LT:
534  case S4G_NODE_TYPE_LOG_LE:
535  return 18;
536 
537  case S4G_NODE_TYPE_LOG_EQ:
538  case S4G_NODE_TYPE_LOG_EQT:
539  case S4G_NODE_TYPE_LOG_NEQ:
540  case S4G_NODE_TYPE_LOG_NEQT:
541  return 17;
542 
543  case S4G_NODE_TYPE_BIT_AND:
544  return 16;
545 
546  case S4G_NODE_TYPE_BIT_XOR:
547  return 15;
548 
549  case S4G_NODE_TYPE_BIT_OR:
550  return 14;
551 
552  case S4G_NODE_TYPE_LOG_AND:
553  return 13;
554 
555  case S4G_NODE_TYPE_LOG_OR:
556  return 12;
557 
558  //case S4G_NODE_TYPE_GROUP_B:
559  //case S4G_NODE_TYPE_GROUP_E:
560  // return 10;
561 
562  default:
563  return -1;
564  }
565 }
566 
569 {
570  s4g_BaseNode(s4g_Lexeme *pLexeme = NULL, s4g_Variable* pVariable = 0)
571  {
572  m_type = S4G_NODE_TYPE_BEGIN; m_pLexeme = pLexeme; m_pVariable = pVariable;
573  ud = 0;
574  m_pNext = 0;
575  }
579 
581  int ud;
582 
583  virtual void debugPrint()
584  {
585  }
586 
587  virtual String dumpChilds()
588  {
589  return("");
590  }
591 
592  String Dump()
593  {
594  String out = "{type:'";
595  out += TypeStr(m_type);
596  out += "'";
597 
598  out += ",value:null";
599  /*out += ",value:";
600  if(value && int(value) >10)
601  {
602  out += "{name:'";
603  out += value->m_szName;
604  out += "',value:'";
605  switch(value->m_pData->m_TypeValue)
606  {
607  case S4G_TYPE_NONE:
608  out += "t_none";
609  break;
610  case S4G_TYPE_NULL:
611  out += "t_null";
612  break;
613  case S4G_TYPE_TABLE:
614  out += "t_table";
615  break;
616  case S4G_TYPE_STRING:
617  {
618  String * _str = (String*)(value->m_pData->data.p);
619  for(int i = 0; i < _str->length(); ++i)
620  {
621  if(_str[0][i] == '\n')
622  {
623  out += "\\n";
624  }
625  else
626  {
627  out += _str[0][i];
628  }
629  }
630  }
631  break;
632  case S4G_TYPE_FLOAT:
633  out += value->m_pData->data.f;
634  break;
635  case S4G_TYPE_INT:
636  out += value->m_pData->data.i;
637  break;
638  case S4G_TYPE_UINT:
639  out += (DWORD)(value->m_pData->data.ui);
640  break;
641  case S4G_TYPE_BOOL:
642  out += value->m_pData->data.b;
643  break;
644  case S4G_TYPE_PDATA:
645  out += "t_pdata";
646  break;
647  case S4G_TYPE_CFUNC:
648  out += "t_cfunc";
649  break;
650  case S4G_TYPE_SFUNC:
651  out += "t_sfunc";
652  break;
653  case S4G_TYPE_NNULL:
654  out += "0";
655  break;
656  }
657  out += "'}";
658  }
659  else
660  {
661  out += "null";
662  }*/
663 
664  out += dumpChilds();
665  /*
666  out += ",op1:";
667  if(op1)
668  {
669  out += op1->Dump();
670  }
671  else
672  {
673  out += "null";
674  }
675 
676  out += ",op2:";
677  if(op2)
678  {
679  out += op2->Dump();
680  }
681  else
682  {
683  out += "null";
684  }
685 
686  out += ",op3:";
687  if(op3)
688  {
689  out += op3->Dump();
690  }
691  else
692  {
693  out += "null";
694  }*/
695  /*for(int i = 0, l = ops.size(); i < l; ++i)
696  {
697  out += String(",ops") + i + ":";
698  if(ops[i])
699  {
700  out += ops[i]->Dump();
701  }
702  else
703  {
704  out += "null";
705  }
706  }*/
707  out += ",next:";
708  if(m_pNext)
709  {
710  out += m_pNext->Dump();
711  }
712  else
713  {
714  out += "null";
715  }
716  out += "}";
717  return(out);
718  }
719  const char * TypeStr(S4G_NODE_TYPE t)
720  {
721  switch(t)
722  {
723  case S4G_NODE_TYPE_BEGIN:return("BEGIN");
724  //case S4G_NODE_TYPE_EMPTY:return("EMPTY");
725  case S4G_NODE_TYPE_BLOCK:return("BLOCK");
726  case S4G_NODE_TYPE_EXPR:return("EXPR");
727  case S4G_NODE_TYPE_VAR:return("VAR");
728  case S4G_NODE_TYPE_DECLVAREND:return("DECLVAREND");
729  case S4G_NODE_TYPE_ARRAY:return("ARRAY");
730  case S4G_NODE_TYPE_NULL:return("NULL");
731  case S4G_NODE_TYPE_FLOAT:return("FLOAT");
732  case S4G_NODE_TYPE_INT:return("INT");
733  //case S4G_NODE_TYPE_INT_CR:return("_int_cr");
734  case S4G_NODE_TYPE_UINT:return("UINT");
735  //case S4G_NODE_TYPE_UINT_CR:return("_uint_cr");
736  case S4G_NODE_TYPE_STRING:return("STRING");
737  //case S4G_NODE_TYPE_STRING_CR:return("_string_cr");
738  case S4G_NODE_TYPE_FUNCTION:return("FUNCTION");
739  //case S4G_NODE_TYPE_ARG:return("ARG");
740  case S4G_NODE_TYPE_MARG:return("MARG");
741  //case S4G_NODE_TYPE_SET:return("SET");
742  //case S4G_NODE_TYPE_SETT:return("SETT");
743  //case S4G_NODE_TYPE_GET:return("GET");
744  //case S4G_NODE_TYPE_GET_CR:return("_get_cr");
745  case S4G_NODE_TYPE_CALL:return("CALL");
746  case S4G_NODE_TYPE_ADD:return("ADD");
747  case S4G_NODE_TYPE_SUB:return("SUB");
748  case S4G_NODE_TYPE_MUL:return("MUL");
749  case S4G_NODE_TYPE_DIV:return("DIV");
750  //case S4G_NODE_TYPE_GROUP_B:return("_group_b");
751  //case S4G_NODE_TYPE_GROUP_E:return("_group_e");
752  case S4G_NODE_TYPE_RETURN:return("RETURN");
753  case S4G_NODE_TYPE_STMT:return("STMT");
754  case S4G_NODE_TYPE_STMT_CHAIN:return("STMT_CHAIN");
755  case S4G_NODE_TYPE_ID:return("ID");
756  case S4G_NODE_TYPE_IF:return("IF");
757  case S4G_NODE_TYPE_WHILE:return("WHILE");
758  case S4G_NODE_TYPE_FOR:return("FOR");
759  case S4G_NODE_TYPE_MOD:return("MOD");
760  case S4G_NODE_TYPE_BIT_AND:return("BIT_AND");
761  case S4G_NODE_TYPE_BIT_OR:return("BIT_OR");
762  case S4G_NODE_TYPE_BIT_XOR:return("BIT_XOR");
763  case S4G_NODE_TYPE_BIT_NOT:return("BIT_NOT");
764  case S4G_NODE_TYPE_BIT_SHIFTR:return("BIT_SHIFTR");
765  case S4G_NODE_TYPE_BIT_SHIFTL:return("BIT_SHIFTL");
766  case S4G_NODE_TYPE_LOG_NOT:return("LOG_NOT");
767  case S4G_NODE_TYPE_LOG_EQ:return("LOG_EQ");
768  case S4G_NODE_TYPE_LOG_NEQ:return("LOG_NEQ");
769  case S4G_NODE_TYPE_LOG_GT:return("LOG_GT");
770  case S4G_NODE_TYPE_LOG_LT:return("LOG_LT");
771  case S4G_NODE_TYPE_LOG_GE:return("LOG_GE");
772  case S4G_NODE_TYPE_LOG_LE:return("LOG_LE");
773  case S4G_NODE_TYPE_LOG_NEQT:return("LOG_NEQT");
774  case S4G_NODE_TYPE_LOG_EQT:return("LOG_EQT");
775  case S4G_NODE_TYPE_LOG_AND:return("LOG_AND");
776  case S4G_NODE_TYPE_LOG_OR:return("LOG_OR");
777  case S4G_NODE_TYPE_BREAK:return("BREAK");
778  case S4G_NODE_TYPE_CONTINUE:return("CONTINUE");
779  case S4G_NODE_TYPE_CHAIN:return("CHAIN");
780  case S4G_NODE_TYPE_DO:return("DO");
781  case S4G_NODE_TYPE_DECLVAR:return("DECLVAR");
782  case S4G_NODE_TYPE_ACCESS_DOT:return("ACCESS_DOT");
783  case S4G_NODE_TYPE_ACCESS_SQUARE:return("ACCESS_SQUARE");
784  case S4G_NODE_TYPE_ASSIGN:return("ASSIGN");
785  case S4G_NODE_TYPE_ASSIGN_ADD:return("ASSIGN_ADD");
786  case S4G_NODE_TYPE_ASSIGN_SUB:return("ASSIGN_SUB");
787  case S4G_NODE_TYPE_ASSIGN_MUL:return("ASSIGN_MUL");
788  case S4G_NODE_TYPE_ASSIGN_DIV:return("ASSIGN_DIV");
789  case S4G_NODE_TYPE_ASSIGN_MOD:return("ASSIGN_MOD");
790  case S4G_NODE_TYPE_ASSIGN_BXOR:return("ASSIGN_BXOR");
791 // case S4G_NODE_TYPE_ASSIGN_BNOT:return("ASSIGN_BNOT");
792  case S4G_NODE_TYPE_ASSIGN_BRSH:return("ASSIGN_BRSH");
793  case S4G_NODE_TYPE_ASSIGN_BLSH:return("ASSIGN_BLSH");
794  case S4G_NODE_TYPE_ASSIGN_BAND:return("ASSIGN_BAND");
795  case S4G_NODE_TYPE_ASSIGN_BOR:return("ASSIGN_BOR");
796  case S4G_NODE_TYPE_PREINCR:return("PREINCR");
797  case S4G_NODE_TYPE_PREDECR:return("PREDECR");
798  case S4G_NODE_TYPE_POSTINCR:return("POSTINCR");
799  case S4G_NODE_TYPE_POSTDECR:return("POSTDECR");
800  case S4G_NODE_TYPE_NEGATE:return("NEGATE");
801  case S4G_NODE_TYPE_CLASS:return("CLASS");
802  case S4G_NODE_TYPE_CLASS_VAR:return("CLASS_VAR");
803  case S4G_NODE_TYPE_NEW_OBJ:return("NEW_OBJ");
804  case S4G_NODE_TYPE_TABLE:return("TABLE");
805  case S4G_NODE_TYPE_CONST_DATA:return("CONST_DATA");
806  case S4G_NODE_TYPE_BLOCK_NO_CTX:return("BLOCK_NO_CTX");
807  case S4G_NODE_TYPE_BOOL:return("BOOL");
808  case S4G_NODE_TYPE_TBL_ITEM:return("TBL_ITEM");
809  case S4G_NODE_TYPE_ACCESS_SQUARE_NUM:return("ACCESS_SQUARE_NUM");
810  case S4G_NODE_TYPE_ACCESS_SQUARE_APPEND:return("ACCESS_SQUARE_APPEND");
811  default:return("UNKNOWN");
812  }
813  }
814 };
815 
816 #define DEFINE_NODE(node) struct node: public s4g_BaseNode
817 #define DEFINE_NODE_CONSTRUCTOR(node, type) node(s4g_Lexeme *pLexeme = NULL, s4g_Variable *pVariable = 0): \
818 s4g_BaseNode(pLexeme, pVariable) \
819 { \
820  m_type = type; \
821 }
822 
823 DEFINE_NODE(s4g_ClassNode)
824 {
825  DEFINE_NODE_CONSTRUCTOR(s4g_ClassNode, S4G_NODE_TYPE_CLASS);
826 
827  s4g_BaseNode *m_pName;
828  s4g_BaseNode *m_pExtends;
829  s4g_BaseNode *m_pVars;
830  s4g_BaseNode *m_pFunctions;
831  s4g_BaseNode *m_pClasses;
832 
833  virtual String dumpChilds()
834  {
835  String out;
836  out += ",name:";
837  if(m_pName)
838  {
839  out += m_pName->Dump();
840  }
841  else
842  {
843  out += "null";
844  }
845  out += ",extends:";
846  if(m_pExtends)
847  {
848  out += m_pExtends->Dump();
849  }
850  else
851  {
852  out += "null";
853  }
854  out += ",vars:";
855  if(m_pVars)
856  {
857  out += m_pVars->Dump();
858  }
859  else
860  {
861  out += "null";
862  }
863  out += ",funcs:";
864  if(m_pFunctions)
865  {
866  out += m_pFunctions->Dump();
867  }
868  else
869  {
870  out += "null";
871  }
872  out += ",classes:";
873  if(m_pClasses)
874  {
875  out += m_pClasses->Dump();
876  }
877  else
878  {
879  out += "null";
880  }
881  return(out);
882  }
883 };
884 
885 DEFINE_NODE(s4g_OpNode)
886 {
887  s4g_OpNode(S4G_NODE_TYPE type, s4g_Lexeme *pLexeme = NULL, s4g_Variable *pVariable = 0):
888  s4g_BaseNode(pLexeme, pVariable)
889  {
890  m_type = type;
891  }
892 
893  s4g_BaseNode *m_pLeft;
894  s4g_BaseNode *m_pRight;
895 
896  virtual String dumpChilds()
897  {
898  String out;
899  out += ",left:";
900  if(m_pLeft)
901  {
902  out += m_pLeft->Dump();
903  }
904  else
905  {
906  out += "null";
907  }
908  out += ",right:";
909  if(m_pRight)
910  {
911  out += m_pRight->Dump();
912  }
913  else
914  {
915  out += "null";
916  }
917  return(out);
918  }
919 };
920 DEFINE_NODE(s4g_AssignNode)
921 {
922  s4g_AssignNode(S4G_NODE_TYPE type, s4g_Lexeme *pLexeme = NULL, s4g_Variable *pVariable = 0):
923  s4g_BaseNode(pLexeme, pVariable)
924  {
925  m_type = type;
926  }
927 
928  s4g_BaseNode *m_pLeft;
929  s4g_BaseNode *m_pRight;
930 
931  virtual String dumpChilds()
932  {
933  String out;
934  out += ",left:";
935  if(m_pLeft)
936  {
937  out += m_pLeft->Dump();
938  }
939  else
940  {
941  out += "null";
942  }
943  out += ",right:";
944  if(m_pRight)
945  {
946  out += m_pRight->Dump();
947  }
948  else
949  {
950  out += "null";
951  }
952  return(out);
953  }
954 };
955 DEFINE_NODE(s4g_ExprTmpNode)
956 {
957  s4g_ExprTmpNode(s4g_Lexeme *pLexeme = NULL, s4g_Variable *pVariable = 0):
958  s4g_BaseNode(pLexeme, pVariable)
959  {
960  m_type = S4G_NODE_TYPE_EXPR;
961  m_pExpr = NULL;
962  m_pExprNext = NULL;
963  }
964 
965  s4g_BaseNode *m_pExpr;
966  s4g_ExprTmpNode *m_pExprNext;
967 
968  virtual String dumpChilds()
969  {
970  String out;
971  out += ",expr:";
972  if(m_pExpr)
973  {
974  out += m_pExpr->Dump();
975  }
976  else
977  {
978  out += "null";
979  }
980  out += ",exprNext:";
981  if(m_pExprNext)
982  {
983  out += m_pExprNext->Dump();
984  }
985  else
986  {
987  out += "null";
988  }
989  return(out);
990  }
991 };
992 
993 DEFINE_NODE(s4g_ConstNode)
994 {
995  s4g_ConstNode(s4g_Lexeme *pLexeme, s4g_Variable *pVariable = 0):
996  s4g_BaseNode(pLexeme, pVariable)
997  {
998  switch(pLexeme->m_type)
999  {
1001  m_type = S4G_NODE_TYPE_FLOAT;
1002  break;
1004  m_type = S4G_NODE_TYPE_STRING;
1005  break;
1007  m_type = S4G_NODE_TYPE_INT;
1008  break;
1010  m_type = S4G_NODE_TYPE_UINT;
1011  break;
1013  switch(pLexeme->m_idWord)
1014  {
1015  case S4G_KW_LANG_NULL:
1016  m_type = S4G_NODE_TYPE_NULL;
1017  break;
1018  case S4G_KW_LANG_TRUE:
1019  case S4G_KW_LANG_FALSE:
1020  m_type = S4G_NODE_TYPE_BOOL;
1021  break;
1022  }
1023  }
1024  }
1025 };
1026 
1027 DEFINE_NODE(s4g_ClassVarNode)
1028 {
1029  DEFINE_NODE_CONSTRUCTOR(s4g_ClassVarNode, S4G_NODE_TYPE_CLASS_VAR);
1030 };
1031 
1032 DEFINE_NODE(s4g_VarNode)
1033 {
1034  DEFINE_NODE_CONSTRUCTOR(s4g_VarNode, S4G_NODE_TYPE_VAR);
1035 };
1036 
1037 DEFINE_NODE(s4g_ArrayNode)
1038 {
1039  DEFINE_NODE_CONSTRUCTOR(s4g_ArrayNode, S4G_NODE_TYPE_ARRAY);
1040  s4g_BaseNode *m_pItems;
1041  virtual String dumpChilds()
1042  {
1043  String out;
1044  out += ",items:";
1045  if(m_pItems)
1046  {
1047  out += m_pItems->Dump();
1048  }
1049  else
1050  {
1051  out += "null";
1052  }
1053  return(out);
1054  }
1055 };
1056 
1057 DEFINE_NODE(s4g_TableNode)
1058 {
1059  DEFINE_NODE_CONSTRUCTOR(s4g_TableNode, S4G_NODE_TYPE_TABLE);
1060  s4g_BaseNode *m_pItems;
1061  virtual String dumpChilds()
1062  {
1063  String out;
1064  out += ",items:";
1065  if(m_pItems)
1066  {
1067  out += m_pItems->Dump();
1068  }
1069  else
1070  {
1071  out += "null";
1072  }
1073  return(out);
1074  }
1075 };
1076 
1077 DEFINE_NODE(s4g_BlockNode)
1078 {
1079  DEFINE_NODE_CONSTRUCTOR(s4g_BlockNode, S4G_NODE_TYPE_BLOCK);
1080  s4g_BaseNode *m_pItems;
1081  virtual String dumpChilds()
1082  {
1083  String out;
1084  out += ",items:";
1085  if(m_pItems)
1086  {
1087  out += m_pItems->Dump();
1088  }
1089  else
1090  {
1091  out += "null";
1092  }
1093  return(out);
1094  }
1095 };
1096 
1097 DEFINE_NODE(s4g_StatementNode)
1098 {
1099  DEFINE_NODE_CONSTRUCTOR(s4g_StatementNode, S4G_NODE_TYPE_STMT);
1100  s4g_BaseNode *m_pWhat;
1101  virtual String dumpChilds()
1102  {
1103  String out;
1104  out += ",what:";
1105  if(m_pWhat)
1106  {
1107  out += m_pWhat->Dump();
1108  }
1109  else
1110  {
1111  out += "null";
1112  }
1113  return(out);
1114  }
1115 };
1116 
1117 DEFINE_NODE(s4g_ReturnNode)
1118 {
1119  DEFINE_NODE_CONSTRUCTOR(s4g_ReturnNode, S4G_NODE_TYPE_RETURN);
1120  s4g_BaseNode *m_pWhat;
1121  virtual String dumpChilds()
1122  {
1123  String out;
1124  out += ",what:";
1125  if(m_pWhat)
1126  {
1127  out += m_pWhat->Dump();
1128  }
1129  else
1130  {
1131  out += "null";
1132  }
1133  return(out);
1134  }
1135 };
1136 
1137 DEFINE_NODE(s4g_BreakNode)
1138 {
1139  DEFINE_NODE_CONSTRUCTOR(s4g_BreakNode, S4G_NODE_TYPE_BREAK);
1140  s4g_BaseNode *m_pWhat;
1141  virtual String dumpChilds()
1142  {
1143  String out;
1144  out += ",what:";
1145  if(m_pWhat)
1146  {
1147  out += m_pWhat->Dump();
1148  }
1149  else
1150  {
1151  out += "null";
1152  }
1153  return(out);
1154  }
1155 };
1156 DEFINE_NODE(s4g_ContinueNode)
1157 {
1158  DEFINE_NODE_CONSTRUCTOR(s4g_ContinueNode, S4G_NODE_TYPE_CONTINUE);
1159 };
1160 
1161 DEFINE_NODE(s4g_IDnode)
1162 {
1163  DEFINE_NODE_CONSTRUCTOR(s4g_IDnode, S4G_NODE_TYPE_ID);
1164 };
1165 
1166 DEFINE_NODE(s4g_DeclVarNode)
1167 {
1168  DEFINE_NODE_CONSTRUCTOR(s4g_DeclVarNode, S4G_NODE_TYPE_DECLVAR);
1169 };
1170 
1171 DEFINE_NODE(s4g_CallNode)
1172 {
1173  DEFINE_NODE_CONSTRUCTOR(s4g_CallNode, S4G_NODE_TYPE_CALL);
1174 
1175  s4g_BaseNode *m_pWhat;
1176  s4g_BaseNode *m_pArgs;
1177  virtual String dumpChilds()
1178  {
1179  String out;
1180  out += ",what:";
1181  if(m_pWhat)
1182  {
1183  out += m_pWhat->Dump();
1184  }
1185  else
1186  {
1187  out += "null";
1188  }
1189  out += ",args:";
1190  if(m_pArgs)
1191  {
1192  out += m_pArgs->Dump();
1193  }
1194  else
1195  {
1196  out += "null";
1197  }
1198  return(out);
1199  }
1200 };
1201 DEFINE_NODE(s4g_NewObjNode)
1202 {
1203  DEFINE_NODE_CONSTRUCTOR(s4g_NewObjNode, S4G_NODE_TYPE_NEW_OBJ);
1204 
1205  s4g_BaseNode *m_pWhat;
1206  s4g_BaseNode *m_pArgs;
1207  virtual String dumpChilds()
1208  {
1209  String out;
1210  out += ",what:";
1211  if(m_pWhat)
1212  {
1213  out += m_pWhat->Dump();
1214  }
1215  else
1216  {
1217  out += "null";
1218  }
1219  out += ",args:";
1220  if(m_pArgs)
1221  {
1222  out += m_pArgs->Dump();
1223  }
1224  else
1225  {
1226  out += "null";
1227  }
1228  return(out);
1229  }
1230 };
1231 
1232 DEFINE_NODE(s4g_FunctionNode)
1233 {
1234  DEFINE_NODE_CONSTRUCTOR(s4g_FunctionNode, S4G_NODE_TYPE_FUNCTION);
1235 
1236  s4g_BaseNode *m_pName;
1237  s4g_BaseNode *m_pArgs;
1238  s4g_BaseNode *m_pExterns;
1239  s4g_BaseNode *m_pBody;
1240 
1241  virtual String dumpChilds()
1242  {
1243  String out;
1244  out += ",name:";
1245  if(m_pName)
1246  {
1247  out += m_pName->Dump();
1248  }
1249  else
1250  {
1251  out += "null";
1252  }
1253  out += ",args:";
1254  if(m_pArgs)
1255  {
1256  out += m_pArgs->Dump();
1257  }
1258  else
1259  {
1260  out += "null";
1261  }
1262 
1263  out += ",externs:";
1264  if(m_pExterns)
1265  {
1266  out += m_pExterns->Dump();
1267  }
1268  else
1269  {
1270  out += "null";
1271  }
1272  out += ",body:";
1273  if(m_pBody)
1274  {
1275  out += m_pBody->Dump();
1276  }
1277  else
1278  {
1279  out += "null";
1280  }
1281  return(out);
1282  }
1283 };
1284 
1285 DEFINE_NODE(s4g_IfNode)
1286 {
1287  DEFINE_NODE_CONSTRUCTOR(s4g_IfNode, S4G_NODE_TYPE_IF);
1288 
1289  s4g_BaseNode *m_pCond;
1290  s4g_BaseNode *m_pThen;
1291  s4g_BaseNode *m_pElse;
1292 
1293  virtual String dumpChilds()
1294  {
1295  String out;
1296  out += ",cond:";
1297  if(m_pCond)
1298  {
1299  out += m_pCond->Dump();
1300  }
1301  else
1302  {
1303  out += "null";
1304  }
1305  out += ",then:";
1306  if(m_pThen)
1307  {
1308  out += m_pThen->Dump();
1309  }
1310  else
1311  {
1312  out += "null";
1313  }
1314 
1315  out += ",else:";
1316  if(m_pElse)
1317  {
1318  out += m_pElse->Dump();
1319  }
1320  else
1321  {
1322  out += "null";
1323  }
1324  return(out);
1325  }
1326 };
1327 
1328 DEFINE_NODE(s4g_WhileNode)
1329 {
1330  DEFINE_NODE_CONSTRUCTOR(s4g_WhileNode, S4G_NODE_TYPE_WHILE);
1331 
1332  s4g_BaseNode *m_pCond;
1333  s4g_BaseNode *m_pBody;
1334 
1335  virtual String dumpChilds()
1336  {
1337  String out;
1338  out += ",cond:";
1339  if(m_pCond)
1340  {
1341  out += m_pCond->Dump();
1342  }
1343  else
1344  {
1345  out += "null";
1346  }
1347 
1348  out += ",body:";
1349  if(m_pBody)
1350  {
1351  out += m_pBody->Dump();
1352  }
1353  else
1354  {
1355  out += "null";
1356  }
1357  return(out);
1358  }
1359 };
1360 
1361 DEFINE_NODE(s4g_ForNode)
1362 {
1363  DEFINE_NODE_CONSTRUCTOR(s4g_ForNode, S4G_NODE_TYPE_FOR);
1364 
1365  s4g_BaseNode *m_pInit;
1366  s4g_BaseNode *m_pCond;
1367  s4g_BaseNode *m_pStep;
1368  s4g_BaseNode *m_pBody;
1369 
1370  virtual String dumpChilds()
1371  {
1372  String out;
1373  out += ",init:";
1374  if(m_pInit)
1375  {
1376  out += m_pInit->Dump();
1377  }
1378  else
1379  {
1380  out += "null";
1381  }
1382  out += ",cond:";
1383  if(m_pCond)
1384  {
1385  out += m_pCond->Dump();
1386  }
1387  else
1388  {
1389  out += "null";
1390  }
1391  out += ",step:";
1392  if(m_pStep)
1393  {
1394  out += m_pStep->Dump();
1395  }
1396  else
1397  {
1398  out += "null";
1399  }
1400 
1401  out += ",body:";
1402  if(m_pBody)
1403  {
1404  out += m_pBody->Dump();
1405  }
1406  else
1407  {
1408  out += "null";
1409  }
1410  return(out);
1411  }
1412 };
1413 
1415 struct s4g_Node
1416 {
1417  s4g_Node(S4G_NODE_TYPE type = S4G_NODE_TYPE_BEGIN, ID idLexeme = -1, s4g_Variable* pVariable = 0, s4g_Node* pOp1 = 0, s4g_Node* pOp2 = 0, s4g_Node* pOp3 = 0)
1418  {
1419  m_type = type; m_idLexeme = idLexeme; m_pVariable = pVariable; m_pOp1 = pOp1; m_pOp2 = pOp2; m_pOp3 = pOp3;
1420  ud = 0;
1421  }
1422  S4G_NODE_TYPE m_type; //тип нода
1423  ID m_idLexeme; //id лексемы которая способствовала генерации данного нода
1424  s4g_Variable* m_pVariable; //значение если надо
1425 
1426  //содержимое нода или продолжение
1427  s4g_Node* m_pOp1;
1428  s4g_Node* m_pOp2;
1429  s4g_Node* m_pOp3;
1430  int ud;
1431  Array<s4g_Node*> ops;
1432 
1433 /*#if defined(_DEBUG)
1434  String Dump()
1435  {
1436  String out = "{type:'";
1437  out += TypeStr(type);
1438  out += "'";
1439 
1440  out += ",value:";
1441  if (value && int(value) >10)
1442  {
1443  out += "{name:'";
1444  out += value->m_szName;
1445  out += "',value:'";
1446  switch (value->m_pData->m_TypeValue)
1447  {
1448  case S4G_TYPE_NONE:
1449  out += "t_none";
1450  break;
1451  case S4G_TYPE_NULL:
1452  out += "t_null";
1453  break;
1454  case S4G_TYPE_TABLE:
1455  out += "t_table";
1456  break;
1457  case S4G_TYPE_STRING:
1458  {
1459  String * _str = (String*)(value->m_pData->data.p);
1460  for (int i = 0; i < _str->length(); ++i)
1461  {
1462  if (_str[0][i] == '\n')
1463  {
1464  out += "\\n";
1465  }
1466  else
1467  {
1468  out += _str[0][i];
1469  }
1470  }
1471  }
1472  break;
1473  case S4G_TYPE_FLOAT:
1474  out += value->m_pData->data.f;
1475  break;
1476  case S4G_TYPE_INT:
1477  out += value->m_pData->data.i;
1478  break;
1479  case S4G_TYPE_UINT:
1480  out += (DWORD)(value->m_pData->data.ui);
1481  break;
1482  case S4G_TYPE_BOOL:
1483  out += value->m_pData->data.b;
1484  break;
1485  case S4G_TYPE_PDATA:
1486  out += "t_pdata";
1487  break;
1488  case S4G_TYPE_CFUNC:
1489  out += "t_cfunc";
1490  break;
1491  case S4G_TYPE_SFUNC:
1492  out += "t_sfunc";
1493  break;
1494  case S4G_TYPE_NNULL:
1495  out += "0";
1496  break;
1497  }
1498  out += "'}";
1499  }
1500  else
1501  {
1502  out += "null";
1503  }
1504 
1505  out += ",op1:";
1506  if (op1)
1507  {
1508  out += op1->Dump();
1509  }
1510  else
1511  {
1512  out += "null";
1513  }
1514 
1515  out += ",op2:";
1516  if (op2)
1517  {
1518  out += op2->Dump();
1519  }
1520  else
1521  {
1522  out += "null";
1523  }
1524 
1525  out += ",op3:";
1526  if (op3)
1527  {
1528  out += op3->Dump();
1529  }
1530  else
1531  {
1532  out += "null";
1533  }
1534  for (int i = 0, l = ops.size(); i < l; ++i)
1535  {
1536  out += String(",ops") + i + ":";
1537  if (ops[i])
1538  {
1539  out += ops[i]->Dump();
1540  }
1541  else
1542  {
1543  out += "null";
1544  }
1545  }
1546  out += "}";
1547  return(out);
1548  }
1549  const char * TypeStr(S4G_NODE_TYPE t)
1550  {
1551  switch (t)
1552  {
1553  case S4G_NODE_TYPE_BEGIN:return("_begin");
1554  case S4G_NODE_TYPE_EMPTY:return("_empty");
1555  case S4G_NODE_TYPE_BLOCK:return("_block");
1556  case S4G_NODE_TYPE_EXPR:return("_expr");
1557  case S4G_NODE_TYPE_VAR:return("_var");
1558  case S4G_NODE_TYPE_CRVAR:return("_crvar");
1559  case S4G_NODE_TYPE_NULL:return("_null");
1560  case S4G_NODE_TYPE_FLOAT:return("_float");
1561  case S4G_NODE_TYPE_INT:return("_int");
1562  case S4G_NODE_TYPE_INT_CR:return("_int_cr");
1563  case S4G_NODE_TYPE_UINT:return("_uint");
1564  case S4G_NODE_TYPE_UINT_CR:return("_uint_cr");
1565  case S4G_NODE_TYPE_STRING:return("_string");
1566  case S4G_NODE_TYPE_STRING_CR:return("_string_cr");
1567  case S4G_NODE_TYPE_FUNCTION:return("_function");
1568  case S4G_NODE_TYPE_NNULL:return("_numnull");
1569  case S4G_NODE_TYPE_ARG:return("_arg");
1570  case S4G_NODE_TYPE_MARG:return("_marg");
1571  case S4G_NODE_TYPE_SET:return("_set");
1572  case S4G_NODE_TYPE_SETT:return("_sett");
1573  case S4G_NODE_TYPE_GET:return("_get");
1574  case S4G_NODE_TYPE_GET_CR:return("_get_cr");
1575  case S4G_NODE_TYPE_CALL:return("_call");
1576  case S4G_NODE_TYPE_ADD:return("_add");
1577  case S4G_NODE_TYPE_SUB:return("_sub");
1578  case S4G_NODE_TYPE_MUL:return("_mul");
1579  case S4G_NODE_TYPE_DIV:return("_div");
1580  case S4G_NODE_TYPE_GROUP_B:return("_group_b");
1581  case S4G_NODE_TYPE_GROUP_E:return("_group_e");
1582  case S4G_NODE_TYPE_RETURN:return("_return");
1583  case _create_table:return("_create_table");
1584  case _add_in_table:return("_add_in_table");
1585  case S4G_NODE_TYPE_IF:return("_if");
1586  case S4G_NODE_TYPE_WHILE:return("_while");
1587  case S4G_NODE_TYPE_FOR:return("_for");
1588  case S4G_NODE_TYPE_MOD:return("_mod");
1589  case S4G_NODE_TYPE_BIT_AND:return("_bit_and");
1590  case S4G_NODE_TYPE_BIT_OR:return("_bit_or");
1591  case S4G_NODE_TYPE_BIT_XOR:return("_bit_xor");
1592  case S4G_NODE_TYPE_BIT_NOT:return("_bit_not");
1593  case S4G_NODE_TYPE_BIT_SHIFTR:return("_bit_shiftr");
1594  case S4G_NODE_TYPE_BIT_SHIFTL:return("_bit_shiftl");
1595  case S4G_NODE_TYPE_LOG_NOT:return("_log_not");
1596  case S4G_NODE_TYPE_LOG_EQ:return("_log_eq");
1597  case S4G_NODE_TYPE_LOG_NEQ:return("_log_neq");
1598  case S4G_NODE_TYPE_LOG_GT:return("_log_gt");
1599  case S4G_NODE_TYPE_LOG_LT:return("_log_lt");
1600  case S4G_NODE_TYPE_LOG_GE:return("_log_ge");
1601  case S4G_NODE_TYPE_LOG_LE:return("_log_le");
1602  case S4G_NODE_TYPE_LOG_NEQT:return("_log_neqt");
1603  case S4G_NODE_TYPE_LOG_EQT:return("_log_eqt");
1604  case S4G_NODE_TYPE_LOG_AND:return("_log_and");
1605  case S4G_NODE_TYPE_LOG_OR:return("_log_or");
1606  case S4G_NODE_TYPE_BREAK:return("_break");
1607  case S4G_NODE_TYPE_CONTINUE:return("_continue");
1608  case S4G_NODE_TYPE_CHAIN:return("_chain");
1609  case S4G_NODE_TYPE_DO:return("_do");
1610  default:return("UNKNOWN");
1611  }
1612  }
1613 #endif*/
1614 };
1615 //type == _expr:
1616 //op1 - выражение,
1617 //op2 то что следует за выражением для целостности
1618 
1619 //type == _call:
1620 //op1 - _var
1621 //op2 - значит у нас перечисление того что будем присваивать
1622 //op3 - _arg
1623 //op1 - аргумент
1624 //op2 - _empty
1625 //op1 - _ аргумент
1626 //op2 - _empty
1627 //...
1628 
1629 //type == S4G_NODE_TYPE_FUNCTION:
1630 //op1 - _arg первый аргумент:
1631 //value
1632 //op1 - следующий _arg
1633 //...
1634 //op2 - тело функции
1635 
1636 //type == _set:
1637 //op1 - чему присваиваем
1638 //op2 - то что присваиваем
1639 
1640 //type == _var
1641 //op1 - _get если существует то значит идет обращение к элементу таблицы
1642 //op1 - S4G_NODE_TYPE_STRING/_number/S4G_NODE_TYPE_CRVAR
1643 //op2 - empty
1644 //op1 - _get
1645 //...
1646 //op2 - _var/S4G_NODE_TYPE_CRVAR - если существует нод то значит у нас идет перечисление через запятую переменных которым или которые будем присваивать
1647 //op3 - _var/value/operation - если существует нод значит у нас идут какие то арифметические операции или сравнения
1648 //...
1649 
1650 //type == _create_table
1651 //либо op1 - _sett
1652 //тоже самое что и _set (_sett указыает что манипулируем в таблице)
1653 //либо op1 - _add_in_table
1654 //op1 - то что добавляем в таблицу
1655 //op2 - _empty
1656 //op1 - _add_in_table
1657 //...
1658 //op2 - _empty
1659 //op1 - _sett
1660 //op2 - _empty
1661 //...
1662 
1663 
1664 #endif
базовый класс нода АСТ
Definition: s4g_parse.h:568
String m_sLexeme
строковое представление лексемы
Definition: s4g_parse.h:349
S4G_KW_LANG
идентификаторы ключевых слов языка
Definition: s4g_parse.h:52
const char g_aKeycharsGroupExpr[][S4G_MAX_LEN_KEY_WORD_DEF]
символы группировки выражений
Definition: s4g_parse.h:127
слово препроцессора
Definition: s4g_parse.h:327
int s4g_get_priority(S4G_NODE_TYPE op)
вычисление приоритетов операции
Definition: s4g_parse.h:508
ID m_idFile
порядковый номер файла
Definition: s4g_parse.h:353
S4G_KC_A2O
идентификаторы символов обращения к данным
Definition: s4g_parse.h:162
S4G_KC_ASSIGN_BIT
идентификаторы символов битовых операций с присваиванием
Definition: s4g_parse.h:294
S4G_LEXEME_TYPE m_type
тип лексемы
Definition: s4g_parse.h:351
переменное количество аргументов
Definition: s4g_parse.h:328
S4G_NODE_TYPE m_type
тип нода
Definition: s4g_parse.h:576
const char s4g_key_syms_comment_ms[][S4G_MAX_LEN_KEY_WORD_DEF]
!! снести после проверки препроцессора
Definition: s4g_parse.h:313
const char g_aKeycharsAssignBit[][S4G_MAX_LEN_KEY_WORD_DEF]
символы битовых операций с присваиванием
Definition: s4g_parse.h:283
символ обращения к объекту
Definition: s4g_parse.h:338
const char g_aKeycharsGroupData[][S4G_MAX_LEN_KEY_WORD_DEF]
символы группировки данных
Definition: s4g_parse.h:141
s4g_BaseNode * m_pNext
продолжение
Definition: s4g_parse.h:580
const char g_aKeycharsAccess2Object[][S4G_MAX_LEN_KEY_WORD_DEF]
символы обращения к данным
Definition: s4g_parse.h:154
const char g_aKeycharsBit[][S4G_MAX_LEN_KEY_WORD_DEF]
символы битовых операций
Definition: s4g_parse.h:235
арифметический символ и присвоение
Definition: s4g_parse.h:334
S4G_KC_BIT
идентификаторы символов битовых операций
Definition: s4g_parse.h:246
S4G_KC_LOGIC
идентификаторы символов логических операций
Definition: s4g_parse.h:219
const char g_aKeycharsLogic[][S4G_MAX_LEN_KEY_WORD_DEF]
символы логических операций
Definition: s4g_parse.h:203
S4G_NODE_TYPE
типы нодов
Definition: s4g_parse.h:357
s4g_Variable * m_pVariable
значение если надо
Definition: s4g_parse.h:578
лексема
Definition: s4g_parse.h:342
S4G_KC_GROUPDATA
идентификаторы символов группировки данных
Definition: s4g_parse.h:147
символ разделителя
Definition: s4g_parse.h:329
int m_numStr
номер строки на которой находится лексема
Definition: s4g_parse.h:350
const char g_aKeycharsArithmetic[][S4G_MAX_LEN_KEY_WORD_DEF]
символы арифметических операций
Definition: s4g_parse.h:183
целое беззнаковое число
Definition: s4g_parse.h:325
нод, ключевой объект в абстрактном синтаксическом дереве
Definition: s4g_parse.h:1415
символ битовых операций
Definition: s4g_parse.h:332
const char s4g_key_syms_comment_os[][S4G_MAX_LEN_KEY_WORD_DEF]
!! снести после проверки препроцессора
Definition: s4g_parse.h:307
const char g_aKeywordsLang[][S4G_MAX_LEN_KEY_WORD_DEF]
ключевые слова языка
Definition: s4g_parse.h:22
const char g_aKeycharsAssignArithmetic[][S4G_MAX_LEN_KEY_WORD_DEF]
символы арифметических операций с присваиванием
Definition: s4g_parse.h:257
S4G_KC_GROUPEXPR
идентификаторы символов группировки выражений
Definition: s4g_parse.h:134
символ присвоения
Definition: s4g_parse.h:333
S4G_KW_PP
идентификаторы ключевых слов препроцессора
Definition: s4g_parse.h:97
S4G_KC_DELIMITER
идентификаторы символов разделителей
Definition: s4g_parse.h:120
S4G_LEXEME_TYPE
типы лексем
Definition: s4g_parse.h:319
число с плавающей запятой
Definition: s4g_parse.h:323
S4G_KC_ARITHMETIC
идентификаторы символов арифметических операций
Definition: s4g_parse.h:193
const char g_aKeycharsAssign[][S4G_MAX_LEN_KEY_WORD_DEF]
символы присваивания
Definition: s4g_parse.h:171
символ группировки выражений
Definition: s4g_parse.h:336
const char g_aKeycharsDelimiter[][S4G_MAX_LEN_KEY_WORD_DEF]
символы разделители
Definition: s4g_parse.h:113
ID m_idWord
порядковый номер лексемы из массива слов к которому она относится
Definition: s4g_parse.h:352
символ битовой операции и присвоение
Definition: s4g_parse.h:335
символ группировки данных
Definition: s4g_parse.h:337
переменная
Definition: s4g_types.h:101
арифметический символ
Definition: s4g_parse.h:330
S4G_KC_AASSIGN
идентификаторы символов присваивания
Definition: s4g_parse.h:177
S4G_KC_ASSIGN_ARITHMETIC
идентификаторы символов арифметических операций с присваиванием
Definition: s4g_parse.h:270
Заголовочный файл с основными типами данных
целое знаковое число
Definition: s4g_parse.h:324
const char g_aKeywordsPreproc[][S4G_MAX_LEN_KEY_WORD_DEF]
ключевые слова препроцессора
Definition: s4g_parse.h:82
пользовательское слово
Definition: s4g_parse.h:321
ключевое слово языка
Definition: s4g_parse.h:326
s4g_Lexeme * m_pLexeme
id лексемы которая способствовала генерации данного нода
Definition: s4g_parse.h:577
символ логических операций
Definition: s4g_parse.h:331
строка
Definition: s4g_parse.h:322