parser.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.7
  3. ** Copyright (C) 2003-2007, 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. { "mipmap", TTPAR_MIPMAP },
  40. { "amplify", TTPAR_AMPLIFY },
  41. { "size", TTPAR_SIZE },
  42. { "zbuffer", TTPAR_ZBUFFER },
  43. { "texture", TTPAR_TEXTURE },
  44. { "rect", TTPAR_RECT },
  45. { "hotspot", TTPAR_HOTSPOT },
  46. { "blendmode", TTPAR_BLENDMODE },
  47. { "color", TTPAR_COLOR },
  48. { "zorder", TTPAR_ZORDER },
  49. { "flip", TTPAR_FLIP },
  50. { "scale", TTPAR_SCALE },
  51. { "proportion", TTPAR_PROPORTION},
  52. { "rotation", TTPAR_ROTATION },
  53. { "frames", TTPAR_FRAMES },
  54. { "fps", TTPAR_FPS },
  55. { "mode", TTPAR_MODE },
  56. { "tracking", TTPAR_TRACKING },
  57. { "spacing", TTPAR_SPACING },
  58. { "sprite", TTPAR_SPRITE },
  59. { "mesh", TTPAR_MESH },
  60. { "COLORMUL", TTCON_COLORMUL },
  61. { "COLORADD", TTCON_COLORADD },
  62. { "ALPHABLEND", TTCON_ALPHABLND },
  63. { "ALPHAADD", TTCON_ALPHAADD },
  64. { "ZWRITE", TTCON_ZWRITE },
  65. { "NOZWRITE", TTCON_NOZWRITE },
  66. { "FORWARD", TTCON_FORWARD },
  67. { "REVERSE", TTCON_REVERSE },
  68. { "PINGPONG", TTCON_PINGPONG },
  69. { "NOPINGPONG", TTCON_NOPINGPONG},
  70. { "LOOP", TTCON_LOOP },
  71. { "NOLOOP", TTCON_NOLOOP },
  72. { "CIRCLE", TTCON_CIRCLE },
  73. { "RECT", TTCON_RECT },
  74. { "ALPHA", TTCON_ALPHA },
  75. { NULL, TTNONE }
  76. };
  77. RScriptParser::RScriptParser(char *name, char *scr)
  78. {
  79. hge=hgeCreate(HGE_VERSION);
  80. scriptname=name;
  81. script=scr;
  82. tokenvalue[0]=0;
  83. tokentype=TTNONE;
  84. line=1;
  85. }
  86. int RScriptParser::get_token()
  87. {
  88. int i;
  89. // Skip whitespaces and comments
  90. for(;;)
  91. {
  92. while(*script==' ' || *script=='t' || *script=='n' || *script=='r')
  93. {
  94. if(*script=='n') line++;
  95. script++;
  96. }
  97. if(*script==';') while(*script && *script!='n' && *script!='r') script++;
  98. else break;
  99. }
  100. // End of script
  101. if(!*script) { tokentype=TTEND; tokenvalue[0]=0; return tokentype; }
  102. // Number
  103. if((*script>='0' && *script<='9') || *script=='.' || *script=='-')
  104. {
  105. tokentype=TTNUMBER;
  106. for(i=0;(*script>='0' && *script<='9') || *script=='.' || *script=='-';i++)
  107.  tokenvalue[i]=*script++;
  108. // Hexadecimal number starting with decimal digit
  109. if((*script>='A' && *script<='F') || (*script>='a' && *script<='f'))
  110. {
  111. tokentype=TTSTRING;
  112. for(; (*script>='A' && *script<='F') || (*script>='a' && *script<='f') ; i++)
  113.  tokenvalue[i]=*script++;
  114. }
  115. tokenvalue[i]=0;
  116. return tokentype;
  117. }
  118. // Quoted string
  119. if(*script=='"')
  120. {
  121. tokentype=TTSTRING;
  122. script++;
  123. for(i=0;*script && *script!='"' && *script!='n' && *script!='r';i++)
  124.  tokenvalue[i]=*script++;
  125. tokenvalue[i]=0;
  126. if(*script) script++;
  127. return tokentype;
  128. }
  129. // Keyword
  130. for(i=0;keytable[i].word;i++)
  131. if(!strtkcmp(keytable[i].word, script))
  132. {
  133. tokentype = keytable[i].code;
  134. strcpy(tokenvalue,keytable[i].word);
  135. script+=strlen(keytable[i].word);
  136. return tokentype;
  137. }
  138. // Unquoted string or hexadecimal number
  139. tokentype=TTSTRING;
  140. for(i=0;
  141. *script && *script!=' ' && *script!='t' && *script!='n' && *script!='r'
  142. && *script!=',' && *script!='=' && *script!='{' && *script!='}' && *script!=':';
  143. i++)
  144. tokenvalue[i]=*script++;
  145. tokenvalue[i]=0;
  146. return tokentype;
  147. }
  148. bool RScriptParser::strtkcmp(char *str, char *mem)
  149. {
  150. int i,len=strlen(str);
  151. for(i=0;i<len;i++)
  152. {
  153. if(!mem[i]) return true;
  154. if(mem[i] != str[i]) return true;
  155. }
  156. return false;
  157. }
  158. DWORD RScriptParser::tkn_hex()
  159. {
  160. int i;
  161. DWORD dw=0;
  162. char chr;
  163. for(i=0; tokenvalue[i]; i++)
  164. {
  165. chr=tokenvalue[i];
  166. if(chr >= 'a') chr-='a'-':';
  167. if(chr >= 'A') chr-='A'-':';
  168. chr-='0';
  169. if(chr>0xF) chr=0xF;
  170. dw=(dw << 4) | chr;
  171. }
  172. return dw;
  173. }
  174. void RScriptParser::ScriptPostError(char *msg1, char *msg2)
  175. {
  176. hge->System_Log("%s, line %d: %s'%s'%s",
  177. get_name(), get_line(), msg1, tokenvalue[0] ? tkn_string():"<EOF>", msg2);
  178. }