parser.cpp
上传用户:maxiaolivb
上传日期:2022-06-07
资源大小:915k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.5
  3. ** Copyright (C) 2003-2004, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** Resource script parser implementation
  7. */
  8. #include "parser.h"
  9. HGE *RScriptParser::hge=0;
  10. struct keyword
  11. {
  12. char* word;
  13. int code;
  14. };
  15. keyword keytable[]=
  16. {
  17. { "=", TTEQUALS },
  18. { ":", TTBASED },
  19. { ",", TTSEPARATOR },
  20. { "{", TTOPENBLOCK },
  21. { "}", TTCLOSEBLOCK },
  22. { "true", TTBOOL },
  23. { "false", TTBOOL },
  24. { "Include", TTRES_INCLUDE },
  25. { "Resource", TTRES_RESOURCE },
  26. { "Texture", TTRES_TEXTURE },
  27. { "Sound", TTRES_SOUND },
  28. { "Music", TTRES_MUSIC },
  29. { "Stream", TTRES_STREAM },
  30. { "Target", TTRES_TARGET },
  31. { "Sprite", TTRES_SPRITE },
  32. { "Animation", TTRES_ANIMATION },
  33. { "Font", TTRES_FONT },
  34. { "Particle", TTRES_PARTICLE },
  35. { "Distortion", TTRES_DISTORT },
  36. { "StringTable",TTRES_STRTABLE },
  37. { "filename", TTPAR_FILENAME },
  38. { "resgroup", TTPAR_RESGROUP },
  39. { "size", TTPAR_SIZE },
  40. { "zbuffer", TTPAR_ZBUFFER },
  41. { "texture", TTPAR_TEXTURE },
  42. { "rect", TTPAR_RECT },
  43. { "hotspot", TTPAR_HOTSPOT },
  44. { "blendmode", TTPAR_BLENDMODE },
  45. { "color", TTPAR_COLOR },
  46. { "zorder", TTPAR_ZORDER },
  47. { "flip", TTPAR_FLIP },
  48. { "scale", TTPAR_SCALE },
  49. { "rotation", TTPAR_ROTATION },
  50. { "frames", TTPAR_FRAMES },
  51. { "fps", TTPAR_FPS },
  52. { "mode", TTPAR_MODE },
  53. { "tracking", TTPAR_TRACKING },
  54. { "spacing", TTPAR_SPACING },
  55. { "sprite", TTPAR_SPRITE },
  56. { "mesh", TTPAR_MESH },
  57. { "COLORMUL", TTCON_COLORMUL },
  58. { "COLORADD", TTCON_COLORADD },
  59. { "ALPHABLEND", TTCON_ALPHABLND },
  60. { "ALPHAADD", TTCON_ALPHAADD },
  61. { "ZWRITE", TTCON_ZWRITE },
  62. { "NOZWRITE", TTCON_NOZWRITE },
  63. { "FORWARD", TTCON_FORWARD },
  64. { "REVERSE", TTCON_REVERSE },
  65. { "PINGPONG", TTCON_PINGPONG },
  66. { "NOPINGPONG", TTCON_NOPINGPONG},
  67. { "LOOP", TTCON_LOOP },
  68. { "NOLOOP", TTCON_NOLOOP },
  69. { "CIRCLE", TTCON_CIRCLE },
  70. { "RECT", TTCON_RECT },
  71. { "ALPHA", TTCON_ALPHA },
  72. { NULL, TTNONE }
  73. };
  74. RScriptParser::RScriptParser(char *name, char *scr)
  75. {
  76. hge=hgeCreate(HGE_VERSION);
  77. scriptname=name;
  78. script=scr;
  79. tokenvalue[0]=0;
  80. tokentype=TTNONE;
  81. line=1;
  82. }
  83. int RScriptParser::get_token()
  84. {
  85. int i;
  86. // Skip whitespaces and comments
  87. for(;;)
  88. {
  89. while(*script==' ' || *script=='t' || *script=='n' || *script=='r')
  90. {
  91. if(*script=='n') line++;
  92. script++;
  93. }
  94. if(*script==';') while(*script && *script!='n' && *script!='r') script++;
  95. else break;
  96. }
  97. // End of script
  98. if(!*script) { tokentype=TTEND; tokenvalue[0]=0; return tokentype; }
  99. // Number
  100. if((*script>='0' && *script<='9') || *script=='.' || *script=='-')
  101. {
  102. tokentype=TTNUMBER;
  103. for(i=0;(*script>='0' && *script<='9') || *script=='.' || *script=='-';i++)
  104.  tokenvalue[i]=*script++;
  105. tokenvalue[i]=0;
  106. return tokentype;
  107. }
  108. // Quoted string
  109. if(*script=='"')
  110. {
  111. tokentype=TTSTRING;
  112. script++;
  113. for(i=0;*script && *script!='"' && *script!='n' && *script!='r';i++)
  114.  tokenvalue[i]=*script++;
  115. tokenvalue[i]=0;
  116. if(*script) script++;
  117. return tokentype;
  118. }
  119. // Keyword
  120. for(i=0;keytable[i].word;i++)
  121. if(!strtkcmp(keytable[i].word, script))
  122. {
  123. tokentype = keytable[i].code;
  124. strcpy(tokenvalue,keytable[i].word);
  125. script+=strlen(keytable[i].word);
  126. return tokentype;
  127. }
  128. // Unquoted string
  129. tokentype=TTSTRING;
  130. for(i=0;
  131. *script && *script!=' ' && *script!='t' && *script!='n' && *script!='r'
  132. && *script!=',' && *script!='=' && *script!='{' && *script!='}' && *script!=':';
  133. i++)
  134. tokenvalue[i]=*script++;
  135. tokenvalue[i]=0;
  136. return tokentype;
  137. }
  138. bool RScriptParser::strtkcmp(char *str, char *mem)
  139. {
  140. int i,len=strlen(str);
  141. for(i=0;i<len;i++)
  142. {
  143. if(!mem[i]) return true;
  144. if(mem[i] != str[i]) return true;
  145. }
  146. return false;
  147. }
  148. DWORD RScriptParser::tkn_hex()
  149. {
  150. int i;
  151. DWORD dw=0;
  152. char chr;
  153. for(i=0; tokenvalue[i]; i++)
  154. {
  155. chr=tokenvalue[i];
  156. if(chr >= 'a') chr-='a'-':';
  157. if(chr >= 'A') chr-='A'-':';
  158. chr-='0';
  159. if(chr>0xF) chr=0xF;
  160. dw=(dw << 4) | chr;
  161. }
  162. return dw;
  163. }
  164. void RScriptParser::ScriptPostError(char *msg1, char *msg2)
  165. {
  166. hge->System_Log("%s, line %d: %s'%s'%s",
  167. get_name(), get_line(), msg1, tokenvalue[0] ? tkn_string():"<EOF>", msg2);
  168. }