Lua源码学习-lparser.h

/*
** $Id: lparser.h,v 1.74 2014/10/25 11:50:46 roberto Exp $
** Lua Parser
** See Copyright Notice in lua.h
*/

#ifndef lparser_h
#define lparser_h

#include "llimits.h"
#include "lobject.h"
#include "lzio.h"


/*
** Expression descriptor 表达式描述符
*/

typedef enum {
    /* no value
    ** local var1, var2  这种声明就是这种情况,因为后面没有给变量赋值,类似于C的void的了
    */
  VVOID,            
        
  VNIL,
  VTRUE,
  VFALSE,
  
  VK,                  /* info = index of constant in 'k' */

  VKFLT,            /* nval = numerical float value */
  VKINT,            /* nval = numerical integer value */
  
  VNONRELOC,    /* info = result register */
  
  VLOCAL,            /* info = local register */
  VUPVAL,     /* info = index of upvalue in 'upvalues' */
  VINDEXED,        /* t = table register/upvalue; idx = index R/K */
  
  VJMP,                /* info = instruction pc */
  VRELOCABLE, /* info = instruction pc */
  VCALL,            /* info = instruction pc */
  VVARARG            /* info = instruction pc */
} expkind;


#define vkisvar(k)    (VLOCAL <= (k) && (k) <= VINDEXED)
#define vkisinreg(k)    ((k) == VNONRELOC || (k) == VLOCAL)

typedef struct expdesc {
  expkind k;  /* 表达式的类型 eg: VNIL, VK ... */

  union {
    struct {        /* for indexed variables (VINDEXED) */
      short idx;      /* index (R/K) */
      lu_byte t;      /* table (register or upvalue) */
      lu_byte vt;      /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */
    } ind;    /* ind->index */
        
    /*
    ** k==VK时,表示Proto.k中的索引
    */
    int info;                      /* for generic use:意如前面注释 */

    lua_Number nval;         /* for VKFLT,存储表达式的浮点值或整数值 */
    lua_Integer ival;   /* for VKINT */
  } u;
    
  int t;  /* patch list of 'exit when true' */
  int f;  /* patch list of 'exit when false' */
} expdesc;


/* description of active local variable */
typedef struct Vardesc {
  short idx;  /* variable index in stack */
} Vardesc;


/* description of pending goto statements and label statements */
typedef struct Labeldesc {
  TString *name;      /* label identifier */
  int pc;                  /* position in code */
  int line;              /* line where it appeared */
  lu_byte nactvar;  /* local level where it appears in current block */
} Labeldesc;

/* list of labels or gotos */
typedef struct Labellist {
  Labeldesc *arr;      /* array */
  int n;                   /* number of entries(条目) in use */
  int size;              /* array size */
} Labellist;


/* dynamic structures used by the parser */
typedef struct Dyndata {
  struct {  /* list of active local variables */
    Vardesc *arr;    /* buf地址 */        
    int size;            /* 能容纳的element总长 */
    int n;                /* 当前已使用个数 */
  } actvar;
  Labellist gt;          /* list of pending gotos */
  Labellist label;  /* list of active labels */
} Dyndata;


/* control of blocks */
struct BlockCnt;  /* defined in lparser.c */


/* state needed to generate(生成) code for a given function(给定功能) */
typedef struct FuncState {
  Proto *f;         /* current function header */

  /*
  ** local function a(...)
  **    local function b(...)
  **        local function c(...)
  **        end
  **    end
  ** end
  ** c->prev=b
  ** b->prev=a
  ** a->prev=mainF
   */
  struct FuncState *prev;   /* enclosing(封闭) function */

  /* lexical state 全局的分析器? */
  struct LexState *ls;

  /*
  ** chain of current blocks
  ** 嵌套的作用域(代码块)
  */
  struct BlockCnt *bl;      

  /* Program Counter */
  int pc;           /* next position to code (equivalent to 'ncode') */
  
  int lasttarget;   /* 'label' of last 'jump label' */

  /* 待修改的跳转指令的List */
  int jpc;          /* list of pending jumps to 'pc' */

  int nk;           /* number of elements in 'k' f->k */
  
  int np;           /* number of elements in 'p' */

  int firstlocal;   /* index of first local var (in Dyndata array) */
  short nlocvars;   /* number of elements in 'f->locvars' */

  lu_byte nactvar;  /* number of active local variables */
  
  lu_byte nups;     /* number of upvalues */
    
    /* 空闲的寄存器的首位置? */
  lu_byte freereg;  /* first free register */
} FuncState;


LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
                                 Dyndata *dyd, const char *name, int firstchar);


#endif
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值