⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scriptengine.h

📁 自己寫一個語言分析解釋器
💻 H
字号:
#if !defined(AFX_SCRIPTENGINE_H__20050805_F673_570F_6CD8_0080AD509054__INCLUDED_)
#define AFX_SCRIPTENGINE_H__20050805_F673_570F_6CD8_0080AD509054__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "BasScript.h"
#include "Tokenizer.h"


class CScriptEngine : public CBaseScript, public IScriptCallback
{
public:
   CScriptEngine();
   ~CScriptEngine();

   void Clear();
   void Cancel();
   bool RunScript(LPCSTR pstrCode);
   bool RunScriptFromFile(LPCSTR pstrFilename);

   bool Evaluate(LPCSTR pstrCode, VARIANT* pRet);

   bool RegisterObject(LPCSTR pstrName, IScriptCallback* pCallback);
   bool RegisterGlobals(IScriptCallback* pCallback);

   void GetErrorMessage(int& iLineNum, 
      LPSTR pstrMessage, int cchMessage, 
      LPSTR pstrCode, int cchCode, 
      LPSTR pstrLine, int cchLine);

   // IScriptCallback

   bool GetProperty(LPCWSTR pstrName, VARIANT* pvValue);
   bool SetProperty(LPCWSTR pstrName, VARIANT vValue);
   bool Method(LPCWSTR pstrName, VARIANT* pvArgs, int nArgs, VARIANT* pvRet);

private:
   enum { MAX_VARIABLES = 100 };
   enum { MAX_FUNCTIONS = 50 };
   enum { MAX_OBJECTS = 20 };
   enum { MAX_STACKDEPTH = 20 };
   enum { MAX_ARGUMENTS = 12 };

   typedef enum EXCEP
   {
      EXCEP_NOP = 0,
      EXCEP_SYNTAXERROR,
      EXCEP_TYPEMISMATCH,
      EXCEP_NAMEEXPECTED,
      EXCEP_CODEOVERFLOW,
      EXCEP_PARAMOVERFLOW,
      EXCEP_STACKOVERFLOW,
      EXCEP_SCOPE,
      EXCEP_NOTFOUND,
      EXCEP_KEYWORD,
      EXCEP_DUPLICATE,
      EXCEP_ERROR,
      EXCEP_PAREN,
      EXCEP_ARGUMENTS,
      EXCEP_BREAK,
      EXCEP_RETURN,
      EXCEP_CANCELLED,
   };

private:
   void _InterpretError(EXCEP e);

   void __level6(VARIANT* pVar);
   void __level5(VARIANT* pVar);
   void __level4(VARIANT* pVar);
   void __level3(VARIANT* pVar);
   void __level2(VARIANT* pVar);
   void __level1(VARIANT* pVar);
   void __level0(VARIANT* pVar);
   void __eval(VARIANT* pVar);

   void __forloop();
   void __whileloop();
   void __ifcondit();
   void __switchcondit();
   void __break();
   void __return();

   void __func_define();
   void __var_define();
   void __var_define(LPCWSTR pstrName, VARIANT& vValue);
   void __var_assign();
   void __var_retrieve(VARIANT* pVar);
   void __var_getargs(VARIANT* pArgs, int& nArgs);
   void __skipblock();
   void __popstack(int iPos);
   int __pushstack();
   
   void __block();
   void __statement();
   void __exec(OPTYPE Stop);
   void __run(LPCWSTR pstrCode);

   bool __func_strlen(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_strstr(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_strpos(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_strupper(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_strlower(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_atoi(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_substr(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_fopen(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_fclose(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_fgets(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_fputs(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_feof(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_sleep(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_eval(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);
   bool __func_exit(VARIANT* pvArgs, int nArgs, VARIANT* pvRet);

private:
   LPWSTR pstrScript;
   LPWSTR pstrStore;
   CTokenizer tok;
   TOKEN t;
   char m_szErrorMsg[64];
   char m_szErrorCode[40];
   char m_szErrorLine[100];
   int m_iErrorLineNum;

   typedef struct VARIABLE
   {
      WCHAR szName[MAX_KEYWORD_LEN];
      VARIANT vValue;
   };
   VARIABLE m_vars[MAX_VARIABLES];
   int m_nVars;

   typedef struct CALLBACKDEF
   {
      WCHAR szName[MAX_KEYWORD_LEN];
      IScriptCallback* pCallback;
   };
   CALLBACKDEF m_Objects[MAX_OBJECTS];
   int m_nObjects;

   typedef struct FUNCTIONDEF
   {
      WCHAR szName[MAX_KEYWORD_LEN];
      LPCWSTR pstrCode;
      int iLineNo;
   };
   FUNCTIONDEF m_Functions[MAX_FUNCTIONS];
   int m_nFunctions;

   typedef struct STACKLEVEL
   {
      LPCWSTR pstrCode;
      int iLineNo;
      int iVarIndex;
      VARIANT vRet;
      OPTYPE t;
   };
   STACKLEVEL m_Stack[MAX_STACKDEPTH];
   int m_nStackLevel;

   volatile bool m_bCancelled;
};


#endif // !defined(AFX_SCRIPTENGINE_H__20050805_F673_570F_6CD8_0080AD509054__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -