📄 chsgram.y
字号:
{ $$ = $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 + -