syntax.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. #include "__virtualmath.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(int p, LexMather *mather){
  15. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1 || mather->status == LEXMATHER_ING_2)
  16. if (isdigit(p) || '.' == p && mather->status == LEXMATHER_ING_1){
  17. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  18. mather->len += 1;
  19. if ('.' == p)
  20. mather->status = LEXMATHER_ING_2;
  21. else if (mather->status == LEXMATHER_START)
  22. mather->status = LEXMATHER_ING_1;
  23. }
  24. else if(mather->status == LEXMATHER_ING_1 || mather->status == LEXMATHER_ING_2){
  25. if (isalpha(p) ||'_' == p){
  26. mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
  27. mather->status = LEXMATHER_ING_3;
  28. }
  29. else
  30. mather->status = LEXMATHER_END_1;
  31. }
  32. else
  33. mather->status = LEXMATHER_MISTAKE;
  34. else if (mather->status == LEXMATHER_ING_3)
  35. if (isalnum(p) ||'_' == p)
  36. mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
  37. else
  38. mather->status = LEXMATHER_END_1;
  39. else
  40. mather->status = LEXMATHER_MISTAKE;
  41. }
  42. /**
  43. * 匹配一个变量
  44. * 匹配模式:匹配器结束模式为END_SECOND模式,也就是当checkoutMather检查的时候,END_SECOND位于END的优先级之后。
  45. * END_SECOND解决了冲突:关键词if可以满足varMather的匹配,但他并不是变量,if有特殊的匹配器(strMather)来匹配。
  46. * 匹配内容:a, a_123
  47. * @param p
  48. * @param mather
  49. */
  50. void varMather(int p, LexMather *mather){
  51. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1){
  52. if (isalpha(p) ||'_' == p || isdigit(p) && mather->status == LEXMATHER_ING_1){
  53. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  54. mather->len ++;
  55. mather->status = LEXMATHER_ING_1;
  56. }
  57. else if(mather->status == LEXMATHER_ING_1)
  58. mather->status = LEXMATHER_END_2;
  59. else if(mather->status == LEXMATHER_START)
  60. mather->status = LEXMATHER_MISTAKE;
  61. }
  62. else{
  63. mather->status = LEXMATHER_MISTAKE;
  64. }
  65. }
  66. /**
  67. * 匹配一个字符串字面量
  68. * 注意:string_type记录的是字符串结束标志(‘或者“)
  69. * 此处引进LEXMATHER_PASS,是为了在匹配到结束标志"或者'后,多读取一个字符,然后在统一回退
  70. * 匹配内容:’134‘,”123“
  71. * @param p
  72. * @param mather
  73. */
  74. void stringMather(int p, LexMather *mather){
  75. if (mather->status == LEXMATHER_START)
  76. if ('\"' == p || '\'' == p){
  77. mather->status = LEXMATHER_ING_1;
  78. mather->string_type = p;
  79. }
  80. else
  81. mather->status = LEXMATHER_MISTAKE;
  82. else if (mather->status == LEXMATHER_ING_1)
  83. if (mather->string_type == p)
  84. mather->status = LEXMATHER_ING_4;
  85. else if (EOF == p)
  86. mather->status = LEXMATHER_MISTAKE;
  87. else{
  88. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  89. mather->len ++;
  90. mather->status = LEXMATHER_ING_1;
  91. }
  92. else if (mather->status == LEXMATHER_ING_3)
  93. if (isalnum(p) ||'_' == p)
  94. mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
  95. else
  96. mather->status = LEXMATHER_END_1;
  97. else if(mather->status == LEXMATHER_ING_4)
  98. if (isalpha(p) ||'_' == p){
  99. mather->second_str = memStrCharcpy(mather->second_str, 1, true, true, p);
  100. mather->status = LEXMATHER_ING_3;
  101. }
  102. else
  103. mather->status = LEXMATHER_END_1;
  104. else
  105. mather->status = LEXMATHER_MISTAKE;
  106. }
  107. /**
  108. * 匹配关键词dest_p
  109. * @param p
  110. * @param mather
  111. * @param dest_p
  112. */
  113. void strMather(int p, LexMather *mather, const char *dest_p){
  114. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1)
  115. if (p == dest_p[mather->len]){
  116. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  117. mather->len ++;
  118. mather->status = LEXMATHER_ING_1;
  119. }
  120. else if(mather->status == LEXMATHER_ING_1 && mather->len == memStrlen((char *)dest_p))
  121. mather->status = LEXMATHER_END_1;
  122. else
  123. mather->status = LEXMATHER_MISTAKE;
  124. else
  125. mather->status = LEXMATHER_MISTAKE;
  126. }
  127. /**
  128. * 匹配但个字符dest_p
  129. * @param p
  130. * @param mather
  131. * @param dest_p
  132. */
  133. void charMather(int p, LexMather *mather, int dest_p){
  134. if (p == dest_p && mather->status == LEXMATHER_START){
  135. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  136. mather->len ++;
  137. mather->status = LEXMATHER_ING_1;
  138. }
  139. else if (mather->status == LEXMATHER_ING_1)
  140. mather->status = LEXMATHER_END_1;
  141. else
  142. mather->status = LEXMATHER_MISTAKE;
  143. }
  144. void aCharMather(int p, LexMather *mather, int dest_p) {
  145. if (p == dest_p && mather->status == LEXMATHER_START){
  146. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  147. mather->len ++;
  148. mather->status = LEXMATHER_END_1;
  149. }
  150. else
  151. mather->status = LEXMATHER_MISTAKE;
  152. }
  153. /**
  154. * 匹配空白符号
  155. * @param p
  156. * @param mather
  157. */
  158. void spaceMather(int p, LexMather *mather){
  159. if (mather->status == LEXMATHER_START || mather->status == LEXMATHER_ING_1)
  160. if (isspace(p) && p != '\n'){
  161. mather->str = memStrCharcpy(mather->str, 1, true, true, p);
  162. mather->len ++;
  163. mather->status = LEXMATHER_ING_1;
  164. }
  165. else if (mather->status == LEXMATHER_ING_1)
  166. mather->status = LEXMATHER_END_1;
  167. else
  168. mather->status = LEXMATHER_MISTAKE;
  169. else
  170. mather->status = LEXMATHER_MISTAKE;
  171. }
  172. void backslashMather(int p, LexMather *mather){
  173. if (mather->status == LEXMATHER_START)
  174. if (p == '\\')
  175. mather->status = LEXMATHER_ING_1;
  176. else
  177. mather->status = LEXMATHER_MISTAKE;
  178. else if (mather->status == LEXMATHER_ING_1) {
  179. if (p == EOF)
  180. mather->status = LEXMATHER_END_1;
  181. else if (p == '\n')
  182. mather->status = LEXMATHER_ING_2;
  183. }
  184. else if (mather->status == LEXMATHER_ING_2)
  185. mather->status = LEXMATHER_END_1;
  186. else
  187. mather->status = LEXMATHER_MISTAKE;
  188. }
  189. void commentMather(int p, LexMather *mather){
  190. if (mather->status == LEXMATHER_START) {
  191. if (p == '#')
  192. mather->status = LEXMATHER_ING_1;
  193. else
  194. mather->status = LEXMATHER_MISTAKE;
  195. }
  196. else if (mather->status == LEXMATHER_ING_1) { // 匹配到1个#的模式
  197. if (p == '#')
  198. mather->status = LEXMATHER_ING_3;
  199. else if (p == '\n' || p == EOF)
  200. mather->status = LEXMATHER_END_1;
  201. else
  202. mather->status = LEXMATHER_ING_2;
  203. }
  204. else if (mather->status == LEXMATHER_ING_2){ // 单#匹配模式
  205. if (p == '\n' || p == EOF)
  206. mather->status = LEXMATHER_END_1;
  207. }
  208. else if (mather->status == LEXMATHER_ING_3) { // 双#匹配模式
  209. if (p == '#')
  210. mather->status = LEXMATHER_ING_4;
  211. else if (p == EOF)
  212. mather->status = LEXMATHER_END_1;
  213. }
  214. else if (mather->status == LEXMATHER_ING_4) {
  215. if (p == '#')
  216. mather->status = LEXMATHER_ING_5;
  217. else
  218. mather->status = LEXMATHER_ING_3;
  219. }
  220. else if (mather->status == LEXMATHER_ING_5)
  221. mather->status = LEXMATHER_END_1;
  222. else
  223. mather->status = LEXMATHER_MISTAKE;
  224. }
  225. /**
  226. * 开始匹配,返回的int即checkoutMather返回的值(匹配成功的匹配器的索引)
  227. * @param file
  228. * @param mathers
  229. * @return
  230. */
  231. int getMatherStatus(LexFile *file, LexMathers *mathers) {
  232. int status = -1;
  233. int p;
  234. setupMathers(mathers);
  235. while (status == -1){
  236. p = readChar(file);
  237. if (pm_KeyInterrupt == signal_appear) {
  238. pm_KeyInterrupt = signal_check;
  239. return -3;
  240. }
  241. numberMather(p ,mathers->mathers[MATHER_NUMBER]);
  242. varMather(p ,mathers->mathers[MATHER_VAR]);
  243. spaceMather(p ,mathers->mathers[MATHER_SPACE]);
  244. stringMather(p, mathers->mathers[MATHER_STRING]);
  245. backslashMather(p, mathers->mathers[MATHER_NOTENTER]);
  246. commentMather(p, mathers->mathers[MATHER_COMMENT]);
  247. aCharMather(p, mathers->mathers[MATHER_ENTER], '\n');
  248. charMatherMacro(MATHER_EOF, EOF);
  249. strMatherMacro(MATHER_IF, "if"); // 条件判断
  250. strMatherMacro(MATHER_ELIF, "elif"); // 条件循环
  251. strMatherMacro(MATHER_WHILE, "while"); // 条件循环
  252. strMatherMacro(MATHER_FOR, "for"); // 遍历
  253. strMatherMacro(MATHER_IN, "in"); // 定义类
  254. strMatherMacro(MATHER_TRY, "try"); // 定义函数
  255. strMatherMacro(MATHER_EXCEPT, "except"); // 定义表达式(匿名函数)
  256. strMatherMacro(MATHER_AS, "as"); // 异常捕获
  257. strMatherMacro(MATHER_WITH, "with"); // 异常捕获
  258. strMatherMacro(MATHER_DO, "do"); // 捕获
  259. strMatherMacro(MATHER_ELSE, "else"); // 捕获
  260. strMatherMacro(MATHER_FINALLY, "finally"); // 条件分支
  261. strMatherMacro(MATHER_DEFAULT, "default"); // 条件-否则
  262. strMatherMacro(MATHER_GLOBAL, "global"); // 结束分支
  263. strMatherMacro(MATHER_NONLOCAL, "nonlocal"); // 结束分支
  264. strMatherMacro(MATHER_PUBLIC, "public"); // 结束分支
  265. strMatherMacro(MATHER_PROTECT, "protect"); // break跳出分支(循环、条件等)
  266. strMatherMacro(MATHER_PRIVATE, "private");
  267. strMatherMacro(MATHER_TRUE, "true");
  268. strMatherMacro(MATHER_FALSE, "false");
  269. strMatherMacro(MATHER_NULL, "null");
  270. strMatherMacro(MATHER_DEF, "def");
  271. strMatherMacro(MATHER_CLASS, "class");
  272. strMatherMacro(MATHER_BLOCK, "block");
  273. strMatherMacro(MATHER_BREAK, "break");
  274. strMatherMacro(MATHER_CONTINUE, "continue");
  275. strMatherMacro(MATHER_REGO, "rego");
  276. strMatherMacro(MATHER_RESTART, "restart");
  277. strMatherMacro(MATHER_RETURN, "return");
  278. strMatherMacro(MATHER_YIELD, "yield");
  279. strMatherMacro(MATHER_IMPORT, "import");
  280. strMatherMacro(MATHER_INCLUDE, "include");
  281. charMatherMacro(MATHER_ADD, '+');
  282. charMatherMacro(MATHER_SUB, '-');
  283. charMatherMacro(MATHER_MUL, '*');
  284. charMatherMacro(MATHER_DIV, '/');
  285. strMatherMacro(MATHER_INTDIV, "//");
  286. charMatherMacro(MATHER_PER, '%');
  287. strMatherMacro(MATHER_POW, "**");
  288. strMatherMacro(MATHER_EQ, "==");
  289. strMatherMacro(MATHER_MOREEQ, ">=");
  290. strMatherMacro(MATHER_LESSEQ, "<=");
  291. charMatherMacro(MATHER_MORE, '>');
  292. charMatherMacro(MATHER_LESS, '<');
  293. strMatherMacro(MATHER_NOTEQ, "!=");
  294. charMatherMacro(MATHER_BITAND, '&');
  295. charMatherMacro(MATHER_BITOR, '|');
  296. charMatherMacro(MATHER_BITXOR, '^');
  297. charMatherMacro(MATHER_BITNOT, '~');
  298. strMatherMacro(MATHER_BITLEFT, "<<");
  299. strMatherMacro(MATHER_BITRIGHT, ">>");
  300. strMatherMacro(MATHER_BOOLAND, "&&");
  301. strMatherMacro(MATHER_BOOLOR, "||");
  302. charMatherMacro(MATHER_BOOLNOT, '!');
  303. charMatherMacro(MATHER_ASSIGNMENT, '=');
  304. charMatherMacro(MATHER_POINT, '.');
  305. charMatherMacro(MATHER_AT, '@');
  306. charMatherMacro(MATHER_SVAR, '$');
  307. charMatherMacro(MATHER_LP, '(');
  308. charMatherMacro(MATHER_RP, ')');
  309. charMatherMacro(MATHER_LB, '[');
  310. charMatherMacro(MATHER_RB, ']');
  311. charMatherMacro(MATHER_LC, '{');
  312. charMatherMacro(MATHER_RC, '}');
  313. charMatherMacro(MATHER_COMMA, ',');
  314. charMatherMacro(MATHER_COLON, ':');
  315. charMatherMacro(MATHER_SEMICOLON, ';');
  316. strMatherMacro(MATHER_LINK, "->");
  317. strMatherMacro(MATHER_RAISE, "raise");
  318. strMatherMacro(MATHER_FROM, "from");
  319. strMatherMacro(MATHER_ASSERT, "assert");
  320. strMatherMacro(MATHER_LAMBDA, "lambda");
  321. strMatherMacro(MATHER_GOTO, "goto");
  322. strMatherMacro(MATHER_LABEL, "label");
  323. strMatherMacro(MATHER_PASSVALUE, "...");
  324. strMatherMacro(MATHER_DEL, "del");
  325. status = checkoutMather(mathers, MATHER_MAX);
  326. }
  327. if (status != MATHER_ENTER)
  328. backChar(file);
  329. return status;
  330. }
  331. int lexFilter(LexFile *file, int status){
  332. if (status == MATHER_SPACE || status == MATHER_NOTENTER || status == MATHER_COMMENT)
  333. return -1;
  334. if (file->filter_data.enter != 0 && status == MATHER_ENTER)
  335. return -1;
  336. return status;
  337. }
  338. /**
  339. * getMatherStatus的高级封装,若匹配到空格则自动忽略(再次匹配)
  340. * @param file
  341. * @param mathers
  342. * @return
  343. */
  344. Token *getToken(LexFile *file, LexMathers *mathers) {
  345. int status = MATHER_SPACE;
  346. int filter;
  347. while ((filter = lexFilter(file, status)) == -1)
  348. status = getMatherStatus(file, mathers);
  349. if (status == -2 || status == -3)
  350. return makeLexToken(status, NULL, NULL, file->line);
  351. return makeLexToken(filter, mathers->mathers[status]->str, mathers->mathers[status]->second_str, file->line);
  352. }