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

📄 chsgram.y

📁 五行MMORPG引擎系统V1.0
💻 Y
📖 第 1 页 / 共 2 页
字号:
      { $$ = $2; }
   | stmt
      { $$ = $1; }
   ;

switch_stmt
   : rwSWITCH '(' expr ')' '{' case_block '}'
      { $$ = $6; $6->propagateSwitchExpr($3, false); }
   | rwSWITCHSTR '(' expr ')' '{' case_block '}'
      { $$ = $6; $6->propagateSwitchExpr($3, true); }
   ;

case_block
   : rwCASE case_expr ':' statement_list
      { $$ = IfStmtNode::alloc($1, $2, $4, NULL, false); }
   | rwCASE case_expr ':' statement_list rwDEFAULT ':' statement_list
      { $$ = IfStmtNode::alloc($1, $2, $4, $7, false); }
   | rwCASE case_expr ':' statement_list case_block
      { $$ = IfStmtNode::alloc($1, $2, $4, $5, true); }
   ;

case_expr
   : expr
      { $$ = $1;}
   | case_expr rwCASEOR expr
      { ($1)->append($3); $$=$1; }
   ;

if_stmt
   : rwIF '(' expr ')' stmt_block
      { $$ = IfStmtNode::alloc($1, $3, $5, NULL, false); }
   | rwIF '(' expr ')' stmt_block rwELSE stmt_block
      { $$ = IfStmtNode::alloc($1, $3, $5, $7, false); }
   ;

while_stmt
   : rwWHILE '(' expr ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, nil, $3, nil, $5, false); }
   | rwDO stmt_block rwWHILE '(' expr ')'
      { $$ = LoopStmtNode::alloc($3, nil, $5, nil, $2, true); }
   ;

for_stmt
   : rwFOR '(' expr ';' expr ';' expr ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, $3, $5, $7, $9, false); }
   | rwFOR '(' expr ';' expr ';'      ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, $3, $5, NULL, $8, false); }
   | rwFOR '(' expr ';'      ';' expr ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, $3, NULL, $6, $8, false); }
   | rwFOR '(' expr ';'      ';'      ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, $3, NULL, NULL, $7, false); }
   | rwFOR '('      ';' expr ';' expr ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, NULL, $4, $6, $8, false); }
   | rwFOR '('      ';' expr ';'      ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, NULL, $4, NULL, $7, false); }
   | rwFOR '('      ';'      ';' expr ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, NULL, NULL, $5, $7, false); }
   | rwFOR '('      ';'      ';'      ')' stmt_block
      { $$ = LoopStmtNode::alloc($1, NULL, NULL, NULL, $6, false); }
   ;  

expression_stmt
   : stmt_expr
      { $$ = $1; }
   ;

expr
   : stmt_expr
      { $$ = $1; }
   | '(' expr ')'
      { $$ = $2; }
   | expr '^' expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr '%' expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr '&' expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr '|' expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr '+' expr
      { $$ = FloatBinaryExprNode::alloc($2, $1, $3); }
   | expr '-' expr
      { $$ = FloatBinaryExprNode::alloc($2, $1, $3); }
   | expr '*' expr
      { $$ = FloatBinaryExprNode::alloc($2, $1, $3); }
   | expr '/' expr
      { $$ = FloatBinaryExprNode::alloc($2, $1, $3); }
   | '&' IDENT %prec UNARY
      { 	$$ = StrConstNode::alloc((char*)$2, StrConstNode::T_STRING);  }
   | '&' VAR %prec UNARY
      { 	$$ = StrConstNode::alloc((char*)$2, StrConstNode::T_STRING);  }
   | '-' expr  %prec UNARY
      { $$ = FloatUnaryExprNode::alloc($1, $2); }
   | '*' expr %prec UNARY
      { $$ = TTagDerefNode::alloc($2); }
   | TTAG
      { $$ = TTagExprNode::alloc($1); }
   | expr '?' expr ':' expr
      { $$ = ConditionalExprNode::alloc($1, $3, $5); }
   | expr '<' expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr '>' expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opGE expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opLE expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opEQ expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opNE expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opOR expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opSHL expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opSHR expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opAND expr
      { $$ = IntBinaryExprNode::alloc($2, $1, $3); }
   | expr opSTREQ expr
      { $$ = StreqExprNode::alloc($1, $3, true); }
   | expr opSTRNE expr
      { $$ = StreqExprNode::alloc($1, $3, false); }
   | expr '@' expr
      { $$ = StrcatExprNode::alloc($1, $3, $2); }
   | '!' expr
      { $$ = IntUnaryExprNode::alloc($1, $2); }
   | '~' expr
      { $$ = IntUnaryExprNode::alloc($1, $2); }
   | TAGATOM
      { $$ = StrConstNode::alloc($1, StrConstNode::T_TAG); }
   | FLTCONST
      { $$ = FloatNode::alloc($1); }
   | INTCONST
      { $$ = IntNode::alloc($1); }
   | rwBREAK
      { $$ = ConstantNode::alloc(StringTable->insert("break")); }
   | slot_acc
      { $$ = SlotAccessNode::alloc($1.object, $1.array, $1.slotName); }
   | STRATOM
      { $$ = StrConstNode::alloc($1, StrConstNode::T_STRING); }
   | VSTR
      { $$ = StrConstNode::alloc($1, StrConstNode::T_VSTRING); }
   | VAR
      { $$ = (ExprNode*)VarNode::alloc($1, NULL); }
   | IDENT
      { $$ = (ExprNode*)VarNode::alloc($1, NULL); }
   | VAR '[' aidx_expr ']'
      { $$ = (ExprNode*)VarNode::alloc($1, $3); }
   | IDENT '[' aidx_expr ']'
      { $$ = (ExprNode*)VarNode::alloc($1, $3); }
   ;

slot_acc
   : IDENT '.' IDENT
      { $$.object = ConstantNode::alloc($1); $$.slotName = $3; $$.array = NULL; }
   | IDENT '.' IDENT '[' aidx_expr ']'
      { $$.object = ConstantNode::alloc($1); $$.slotName = $3; $$.array = $5; }
   | expr '.' IDENT
      { $$.object = $1; $$.slotName = $3; $$.array = NULL; }
   | expr '.' IDENT '[' aidx_expr ']'
      { $$.object = $1; $$.slotName = $3; $$.array = $5; }
   | var_decl opOBJPTR IDENT
      { $$.object = $1; $$.slotName = $3; $$.array = NULL; }
   | var_decl opOBJPTR IDENT '[' aidx_expr ']'
      { $$.object = $1; $$.slotName = $3; $$.array = $5; }
   ;

class_name_expr
   : IDENT
      { $$ = ConstantNode::alloc($1); }
   | '(' expr ')'
      { $$ = $2; }
   ;

assign_op_struct
   : opPLUSPLUS
      { $$.token = '+'; $$.expr = FloatNode::alloc(1); }
   | opMINUSMINUS
      { $$.token = '-'; $$.expr = FloatNode::alloc(1); }
   | opPLASN expr
      { $$.token = '+'; $$.expr = $2; }
   | opMIASN expr
      { $$.token = '-'; $$.expr = $2; }
   | opMLASN expr
      { $$.token = '*'; $$.expr = $2; }
   | opDVASN expr
      { $$.token = '/'; $$.expr = $2; }
   | opMODASN expr
      { $$.token = '%'; $$.expr = $2; }
   | opANDASN expr
      { $$.token = '&'; $$.expr = $2; }
   | opXORASN expr
      { $$.token = '^'; $$.expr = $2; }
   | opORASN expr
      { $$.token = '|'; $$.expr = $2; }
   | opSLASN expr
      { $$.token = opSHL; $$.expr = $2; }
   | opSRASN expr
      { $$.token = opSHR; $$.expr = $2; }
   ;

stmt_expr
   : funcall_expr
      { $$ = $1; }
   | object_decl
      { $$ = $1; }
   | VAR '=' expr
      { $$ = AssignExprNode::alloc($1, NULL, $3); }
   | IDENT '=' expr
      { $$ = AssignExprNode::alloc($1, NULL, $3); }
   | VAR '[' aidx_expr ']' '=' expr
      { $$ = AssignExprNode::alloc($1, $3, $6); }
   | IDENT '[' aidx_expr ']' '=' expr
      { $$ = AssignExprNode::alloc($1, $3, $6); }
   | VAR assign_op_struct
      { $$ = AssignOpExprNode::alloc($1, NULL, $2.expr, $2.token); }
   | IDENT assign_op_struct
      { $$ = AssignOpExprNode::alloc($1, NULL, $2.expr, $2.token); }
   | VAR '[' aidx_expr ']' assign_op_struct
      { $$ = AssignOpExprNode::alloc($1, $3, $5.expr, $5.token); }
   | IDENT '[' aidx_expr ']' assign_op_struct
      { $$ = AssignOpExprNode::alloc($1, $3, $5.expr, $5.token); }
   | slot_acc assign_op_struct
      { $$ = SlotAssignOpNode::alloc($1.object, $1.slotName, $1.array, $2.token, $2.expr); }
   | slot_acc '=' expr
      { $$ = SlotAssignNode::alloc($1.object, $1.array, $1.slotName, $3); }
   | slot_acc '=' '{' expr_list '}'
      { $$ = SlotAssignNode::alloc($1.object, $1.array, $1.slotName, $4); }
   ;

funcall_expr
   : IDENT '(' expr_list_decl ')'
     { $$ = FuncCallExprNode::alloc($1, NULL, $3, false); }
   | IDENT opCOLONCOLON IDENT '(' expr_list_decl ')'
     { $$ = FuncCallExprNode::alloc($3, $1, $5, false); }
   | IDENT '.' IDENT '(' expr_list_decl ')'
      { 
      	ConstantNode* pOwner = ConstantNode::alloc($1); 
      	pOwner->append($5); 
      	$$ = FuncCallExprNode::alloc($3, NULL, pOwner, true); 
      }
   | expr '.' IDENT '(' expr_list_decl ')'
      { $1->append($5); $$ = FuncCallExprNode::alloc($3, NULL, $1, true); }
   | var_decl opOBJPTR IDENT '(' expr_list_decl ')'
      { $1->append($5); $$ = FuncCallExprNode::alloc($3, NULL, $1, true); }
   ;

expr_list_decl
   :
      { $$ = NULL; }
   | expr_list
      { $$ = $1; }
   ;

expr_list
   : expr
      { $$ = $1; }
   | expr_list ',' expr
      { ($1)->append($3); $$ = $1; }
   ;

slot_assign_list
   : slot_assign
      { $$ = $1; }
   | slot_assign_list slot_assign
      { $1->append($2); $$ = $1; }
   ;

slot_assign
   : IDENT '=' expr ';'
      { $$ = SlotAssignNode::alloc(NULL, NULL, $1, $3); }
   | rwDATABLOCK '=' expr ';'
      { $$ = SlotAssignNode::alloc(NULL, NULL, StringTable->insert("datablock"), $3); }
   | IDENT '[' aidx_expr ']' '=' expr ';'
      { $$ = SlotAssignNode::alloc(NULL, $3, $1, $6); }
   ;

aidx_expr
   : expr
      { $$ = $1; }
   | aidx_expr ',' expr
      { $$ = CommaCatExprNode::alloc($1, $3); }
   ;
%%

⌨️ 快捷键说明

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