syntax.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. #include "__syntax.h"
  2. /**
  3. * 匹配一个数字字面量
  4. * 匹配器规则:
  5. * START模式:判断比较第一个字符(是否为数字或者小数点),若匹配成功则进入ING模式,若失败则进入MISTAKE模式
  6. * ING模式:继续匹配,直到遇到非数字或小数点。则检查是否为英文字母,若是则进入SECOND模式,否则进入END模式
  7. * SECOND模式:继续匹配,知道遇到非字母、下划线、数字的内容,进入END模式
  8. * END模式:进入END模式意味着匹配结束了,通过checkoutMather可以检查该匹配器是否被采用,采用后则生成token,并且读取器回退一个字符
  9. * MISTAKE模式:错误
  10. * 匹配内容:12.3jk_2,其中12.3存储在str中,jk_2存储在str_second中
  11. * @param p
  12. * @param mather
  13. */
  14. void numberMather(signed char p, LexMather *mather){
  15. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING || mather->status == LEXMATHER_INGPOINT){
  16. if ('0'<= p && '9' >= p || '.' == p && mather->status == LEXMATHER_ING){
  17. mather->str = memStrcpy(mather->str, 1, true, true, p);
  18. mather->len += 1;
  19. if ('.' == p)
  20. mather->status = LEXMATHER_INGPOINT;
  21. else if (mather->status == LEXMATHER_START)
  22. mather->status = LEXMATHER_ING;
  23. }
  24. else if(mather->status == LEXMATHER_ING || mather->status == LEXMATHER_INGPOINT){
  25. if ('A'<= p && 'Z' >= p ||'a'<= p && 'z' >= p ||'_' == p){
  26. mather->second_str = memStrcpy(mather->second_str, 1, true, true, p);
  27. mather->status = LEXMATHER_INGSECOND;
  28. }
  29. else{
  30. mather->status = LEXMATHER_END;
  31. }
  32. }
  33. else{
  34. mather->status = LEXMATHER_MISTAKE;
  35. }
  36. }
  37. else if (mather->status == LEXMATHER_INGSECOND){
  38. if ('A'<= p && 'Z' >= p ||'a'<= p && 'z' >= p ||'_' == p ||
  39. '0'<= p && '9' >= p){
  40. mather->second_str = memStrcpy(mather->second_str, 1, true, true, p);
  41. }
  42. else{
  43. mather->status = LEXMATHER_END;
  44. }
  45. }
  46. else{
  47. mather->status = LEXMATHER_MISTAKE;
  48. }
  49. }
  50. /**
  51. * 匹配一个变量
  52. * 匹配模式:匹配器结束模式为END_SECOND模式,也就是当checkoutMather检查的时候,END_SECOND位于END的优先级之后。
  53. * END_SECOND解决了冲突:关键词if可以满足varMather的匹配,但他并不是变量,if有特殊的匹配器(strMather)来匹配。
  54. * 匹配内容:a, a_123
  55. * @param p
  56. * @param mather
  57. */
  58. void varMather(signed char p, LexMather *mather){
  59. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING){
  60. if ('A'<= p && 'Z' >= p ||'a'<= p && 'z' >= p ||'_' == p ||
  61. '0'<= p && '9' >= p && mather->status == LEXMATHER_ING){
  62. mather->str = memStrcpy(mather->str, 1, true, true, p);
  63. mather->len ++;
  64. mather->status = LEXMATHER_ING;
  65. }
  66. else if(mather->status == LEXMATHER_ING){
  67. mather->status = LEXMATHER_END_SECOND;
  68. }
  69. else if(mather->status == LEXMATHER_START){
  70. mather->status = LEXMATHER_MISTAKE;
  71. }
  72. }
  73. else{
  74. mather->status = LEXMATHER_MISTAKE;
  75. }
  76. }
  77. /**
  78. * 匹配一个字符串字面量
  79. * 注意:string_type记录的是字符串结束标志(‘或者“)
  80. * 此处引进LEXMATHER_PASS,是为了在匹配到结束标志"或者'后,多读取一个字符,然后在统一回退
  81. * 匹配内容:’134‘,”123“
  82. * @param p
  83. * @param mather
  84. */
  85. void stringMather(signed char p, LexMather *mather){
  86. if (mather->status == LEXMATHER_START){
  87. if ('\"' == p || '\'' == p){
  88. mather->status = LEXMATHER_ING;
  89. mather->string_type = p;
  90. }
  91. else{
  92. mather->status = LEXMATHER_MISTAKE;
  93. }
  94. }
  95. else if (mather->status == LEXMATHER_ING){
  96. if (mather->string_type == p){
  97. mather->status = LEXMATHER_INGPASS;
  98. }
  99. else if (EOF == p){
  100. mather->status = LEXMATHER_MISTAKE;
  101. }
  102. else{
  103. mather->str = memStrcpy(mather->str, 1, true, true, p);
  104. mather->len ++;
  105. mather->status = LEXMATHER_ING;
  106. }
  107. }
  108. else if (mather->status == LEXMATHER_INGSECOND){
  109. if ('A'<= p && 'Z' >= p ||'a'<= p && 'z' >= p ||'_' == p ||
  110. '0'<= p && '9' >= p){
  111. mather->second_str = memStrcpy(mather->second_str, 1, true, true, p);
  112. }
  113. else{
  114. mather->status = LEXMATHER_END;
  115. }
  116. }
  117. else if(mather->status == LEXMATHER_INGPASS){
  118. if ('A'<= p && 'Z' >= p ||'a'<= p && 'z' >= p ||'_' == p){
  119. mather->second_str = memStrcpy(mather->second_str, 1, true, true, p);
  120. mather->status = LEXMATHER_INGSECOND;
  121. }
  122. else{
  123. mather->status = LEXMATHER_END;
  124. }
  125. }
  126. else{
  127. mather->status = LEXMATHER_MISTAKE;
  128. }
  129. }
  130. /**
  131. * 匹配关键词dest_p
  132. * @param p
  133. * @param mather
  134. * @param dest_p
  135. */
  136. void strMather(signed char p, LexMather *mather, const char *dest_p){
  137. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING){
  138. if (p == dest_p[mather->len]){
  139. mather->str = memStrcpy(mather->str, 1, true, true, p);
  140. mather->len ++;
  141. mather->status = LEXMATHER_ING;
  142. }
  143. else if(mather->status == LEXMATHER_ING && mather->len == memStrlen((char *)dest_p)){
  144. mather->status = LEXMATHER_END;
  145. }
  146. else{
  147. mather->status = LEXMATHER_MISTAKE;
  148. }
  149. }
  150. else{
  151. mather->status = LEXMATHER_MISTAKE;
  152. }
  153. }
  154. /**
  155. * 匹配但个字符dest_p
  156. * @param p
  157. * @param mather
  158. * @param dest_p
  159. */
  160. void charMather(signed char p, LexMather *mather, signed char dest_p){
  161. if (p == dest_p && mather->status == LEXMATHER_START){
  162. mather->str = memStrcpy(mather->str, 1, true, true, p);
  163. mather->len ++;
  164. mather->status = LEXMATHER_ING;
  165. }
  166. else if (mather->status == LEXMATHER_ING){
  167. mather->status = LEXMATHER_END;
  168. }
  169. else{
  170. mather->status = LEXMATHER_MISTAKE;
  171. }
  172. }
  173. /**
  174. * 开始匹配,返回的int即checkoutMather返回的值(匹配成功的匹配器的索引)
  175. * @param file
  176. * @param mathers
  177. * @return
  178. */
  179. int getMatherStatus(LexFile *file, LexMathers *mathers, FILE *debug) {
  180. setupMathers(mathers);
  181. int status = -1;
  182. while (status == -1){
  183. signed char p = readChar(file);
  184. if (p == EOF)
  185. writeLog_(debug, LEXICAL_DEBUG, "get char: (EOF)\n", NULL);
  186. else if (p == '\n')
  187. writeLog_(debug, LEXICAL_DEBUG, "get char: (\\n)\n", NULL);
  188. else
  189. writeLog_(debug, LEXICAL_DEBUG, "get char: '%c'\n", p);
  190. numberMather(p ,mathers->mathers[MATHER_NUMBER]);
  191. stringMather(p ,mathers->mathers[MATHER_STRING]);
  192. varMather(p ,mathers->mathers[MATHER_VAR]);
  193. charMatherMacro(MATHER_EOF, EOF);
  194. charMatherMacro(MATHER_ENTER, '\n');
  195. charMatherMacro(MATHER_SPACE, ' ');
  196. strMatherMacro(MATHER_IF, "if"); // 条件判断
  197. strMatherMacro(MATHER_ELIF, "elif"); // 条件循环
  198. strMatherMacro(MATHER_WHILE, "while"); // 条件循环
  199. strMatherMacro(MATHER_FOR, "for"); // 遍历
  200. strMatherMacro(MATHER_IN, "in"); // 定义类
  201. strMatherMacro(MATHER_TRY, "try"); // 定义函数
  202. strMatherMacro(MATHER_EXCEPT, "except"); // 定义表达式(匿名函数)
  203. strMatherMacro(MATHER_AS, "as"); // 异常捕获
  204. strMatherMacro(MATHER_WITH, "with"); // 异常捕获
  205. strMatherMacro(MATHER_DO, "do"); // 捕获
  206. strMatherMacro(MATHER_ELSE, "else"); // 捕获
  207. strMatherMacro(MATHER_FINALLY, "finally"); // 条件分支
  208. strMatherMacro(MATHER_DEFAULT, "default"); // 条件-否则
  209. strMatherMacro(MATHER_GLOBAL, "global"); // 结束分支
  210. strMatherMacro(MATHER_NONLOCAL, "nonlocal"); // 结束分支
  211. strMatherMacro(MATHER_PUBLIC, "public"); // 结束分支
  212. strMatherMacro(MATHER_PROTECT, "protect"); // break跳出分支(循环、条件等)
  213. strMatherMacro(MATHER_PRIVATE, "private");
  214. strMatherMacro(MATHER_TRUE, "true");
  215. strMatherMacro(MATHER_FALSE, "false");
  216. strMatherMacro(MATHER_NULL, "null");
  217. strMatherMacro(MATHER_DEF, "def");
  218. strMatherMacro(MATHER_CLASS, "class");
  219. strMatherMacro(MATHER_BLOCK, "block");
  220. strMatherMacro(MATHER_BREAK, "break");
  221. strMatherMacro(MATHER_CONTINUE, "continue");
  222. strMatherMacro(MATHER_REGO, "rego");
  223. strMatherMacro(MATHER_RESTART, "restart");
  224. strMatherMacro(MATHER_RETURN, "return");
  225. strMatherMacro(MATHER_YIELD, "yield");
  226. strMatherMacro(MATHER_IMPORT, "import");
  227. strMatherMacro(MATHER_INCLUDE, "include");
  228. charMatherMacro(MATHER_ADD, '+');
  229. charMatherMacro(MATHER_SUB, '-');
  230. charMatherMacro(MATHER_MUL, '*');
  231. charMatherMacro(MATHER_DIV, '/');
  232. strMatherMacro(MATHER_INTDIV, "//");
  233. charMatherMacro(MATHER_PER, '%');
  234. strMatherMacro(MATHER_POW, "**");
  235. strMatherMacro(MATHER_EQ, "==");
  236. strMatherMacro(MATHER_MOREEQ, ">=");
  237. strMatherMacro(MATHER_LESSEQ, "<=");
  238. charMatherMacro(MATHER_MORE, '>');
  239. charMatherMacro(MATHER_LESS, '<');
  240. strMatherMacro(MATHER_NOTEQ, "!=");
  241. charMatherMacro(MATHER_BITAND, '&');
  242. charMatherMacro(MATHER_BITOR, '|');
  243. charMatherMacro(MATHER_BITXOR, '^');
  244. charMatherMacro(MATHER_BITNOT, '~');
  245. strMatherMacro(MATHER_BITLEFT, "<<");
  246. strMatherMacro(MATHER_BITRIGHT, ">>");
  247. strMatherMacro(MATHER_BOOLAND, "&&");
  248. strMatherMacro(MATHER_BOOLOR, "||");
  249. charMatherMacro(MATHER_BOOLNOT, '!');
  250. charMatherMacro(MATHER_ASSIGNMENT, '=');
  251. charMatherMacro(MATHER_POINT, '.');
  252. charMatherMacro(MATHER_AT, '@');
  253. charMatherMacro(MATHER_SVAR, '$');
  254. charMatherMacro(MATHER_LP, '(');
  255. charMatherMacro(MATHER_RP, ')');
  256. charMatherMacro(MATHER_LB, '[');
  257. charMatherMacro(MATHER_RB, ']');
  258. charMatherMacro(MATHER_LC, '{');
  259. charMatherMacro(MATHER_RC, '}');
  260. charMatherMacro(MATHER_COMMA, ',');
  261. charMatherMacro(MATHER_COLON, ':');
  262. charMatherMacro(MATHER_SEMICOLON, ';');
  263. strMatherMacro(MATHER_LINK, "->");
  264. strMatherMacro(MATHER_RAISE, "raise");
  265. status = checkoutMather(mathers, MATHER_MAX, debug);
  266. writeLog_(debug, LEXICAL_DEBUG, "get status: %d\n", status);
  267. }
  268. backChar(file);
  269. return status;
  270. }
  271. /**
  272. * getMatherStatus的高级封装,若匹配到空格则自动忽略(再次匹配)
  273. * @param file
  274. * @param mathers
  275. * @return
  276. */
  277. Token *getToken(LexFile *file, LexMathers *mathers, FILE *debug) {
  278. writeLog_(debug, DEBUG, "get token: [%ld]\n", file->count);
  279. int status = MATHER_SPACE;
  280. while (status == MATHER_SPACE){
  281. status = getMatherStatus(file, mathers, debug);
  282. }
  283. Token *tmp;
  284. if (status == -2){
  285. writeLog_(debug, ERROR, "lexical ERROR\n", NULL);
  286. tmp = makeLexToken(MATHER_ERROR_, NULL, NULL, file->line);
  287. goto return_;
  288. }
  289. tmp = makeLexToken(status, mathers->mathers[status]->str, mathers->mathers[status]->second_str, file->line);
  290. printTokenEnter(tmp, debug, DEBUG, "new token: ");
  291. writeLog_(debug, DEBUG, "\n", NULL);
  292. return_:
  293. file->count ++;
  294. return tmp;
  295. }