[PHP] php虚拟机的词法解析 →→→→→进入此内容的聊天室

来自 , 2020-01-11, 写在 PHP, 查看 109 次.
URL http://www.code666.cn/view/799de6d3
  1. #include <stdio.h>
  2. #include "demo_def.h"
  3. #include "demo.h"
  4.  
  5. Scanner scanner_globals;
  6.  
  7. #define YYCTYPE char
  8. #define YYFILL(n)
  9. #define STATE(name)  yyc##name
  10. #define BEGIN(state) YYSETCONDITION(STATE(state))
  11. #define LANG_SCNG(v) (scanner_globals.v)
  12. #define SCNG    LANG_SCNG
  13.  
  14. #define YYGETCONDITION()  SCNG(yy_state)
  15. #define YYSETCONDITION(s) SCNG(yy_state) = s
  16. #define YYCURSOR  SCNG(yy_cursor)
  17. #define YYLIMIT   SCNG(yy_limit)
  18. #define YYMARKER  SCNG(yy_marker)
  19.  
  20. int scan(){
  21.     /*!re2c
  22.  
  23.       <INITIAL>"<?php" {BEGIN(ST_IN_SCRIPTING); return T_BEGIN;}
  24.      <ST_IN_SCRIPTING>[0-9]+ {return T_NUMBER;}
  25.      <ST_IN_SCRIPTING>[ \n\t\r]+ {return T_WHITESPACE;}
  26.      <ST_IN_SCRIPTING>"exit" { return T_EXIT; }
  27.      <ST_IN_SCRIPTING>[a-z]+ {return T_LOWER_CHAR;}
  28.      <ST_IN_SCRIPTING>[A-Z]+ {return T_UPPER_CHAR;}
  29.      <ST_IN_SCRIPTING>"?>" {return T_END;}
  30.  
  31.       <ST_IN_SCRIPTING>[^] {return T_UNKNOWN;}
  32.       <*>[^] {return T_INPUT_ERROR;}
  33.      */
  34. }
  35.  
  36. void print_token(int token) {
  37.     switch (token) {
  38.         case T_BEGIN: printf("%s\n", "begin");break;
  39.         case T_NUMBER: printf("%s\n", "number");break;
  40.         case T_LOWER_CHAR: printf("%s\n", "lower char");break;
  41.         case T_UPPER_CHAR: printf("%s\n", "upper char");break;
  42.         case T_EXIT: printf("%s\n", "exit");break;
  43.         case T_UNKNOWN: printf("%s\n", "unknown");break;
  44.         case T_INPUT_ERROR: printf("%s\n", "input error");break;
  45.         case T_END: printf("%s\n", "end");break;
  46.     }
  47. }
  48.  
  49. int main(int argc, char* argv[])
  50. {
  51.     int token;
  52.     BEGIN(INITIAL); //  全局初始化,需要放在scan调用之前
  53.     scanner_globals.yy_cursor = argv[1];    //将输入的第一个参数作为要解析的字符串
  54.  
  55.     while(token = scan()) {
  56.         if (token == T_INPUT_ERROR) {
  57.             printf("%s\n", "input error");
  58.             break;
  59.         }
  60.         if (token == T_END) {
  61.             printf("%s\n", "end");
  62.             break;
  63.         }
  64.         print_token(token);
  65.     }
  66.  
  67.     return 0;
  68. }
  69.  

回复 "php虚拟机的词法解析"

这儿你可以回复上面这条便签

captcha