1fb299fa2Sopenharmony_ci/* 2fb299fa2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at 6fb299fa2Sopenharmony_ci * 7fb299fa2Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb299fa2Sopenharmony_ci * 9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and 13fb299fa2Sopenharmony_ci * limitations under the License. 14fb299fa2Sopenharmony_ci */ 15fb299fa2Sopenharmony_ci 16fb299fa2Sopenharmony_ci/* 使用指令%skeleton "lalr1.cc"选择C++解析器的骨架 */ 17fb299fa2Sopenharmony_ci%skeleton "lalr1.cc" 18fb299fa2Sopenharmony_ci 19fb299fa2Sopenharmony_ci/* 指定bison的版本 */ 20fb299fa2Sopenharmony_ci%require "3.0.4" 21fb299fa2Sopenharmony_ci 22fb299fa2Sopenharmony_ci%define api.namespace {Uscript} //声明命名空间与下面声明的类名结合使用 Uscript::Parser:: 在scanner.l中有体现 23fb299fa2Sopenharmony_ci%define parser_class_name { Parser } 24fb299fa2Sopenharmony_ci%define api.token.constructor 25fb299fa2Sopenharmony_ci%define api.value.type variant //使得类型与token定义可以使用各种复杂的结构与类型 26fb299fa2Sopenharmony_ci%defines //生成各种头文件 location.hh position.hh parser.hpp 27fb299fa2Sopenharmony_ci 28fb299fa2Sopenharmony_ci%code requires 29fb299fa2Sopenharmony_ci{ 30fb299fa2Sopenharmony_ci /*requires中的内容会放在YYLTYPE与YYSTPYPE定义前*/ 31fb299fa2Sopenharmony_ci #include <iostream> 32fb299fa2Sopenharmony_ci #include <string> 33fb299fa2Sopenharmony_ci #include <vector> 34fb299fa2Sopenharmony_ci #include <stdint.h> 35fb299fa2Sopenharmony_ci #include <cmath> 36fb299fa2Sopenharmony_ci #include "location.hh" 37fb299fa2Sopenharmony_ci #include "script_statement.h" 38fb299fa2Sopenharmony_ci #include "script_param.h" 39fb299fa2Sopenharmony_ci #include "script_function.h" 40fb299fa2Sopenharmony_ci #include "script_expression.h" 41fb299fa2Sopenharmony_ci 42fb299fa2Sopenharmony_ci using std::string; 43fb299fa2Sopenharmony_ci 44fb299fa2Sopenharmony_ci namespace Uscript { /*避免包含头文件时冲突 */ 45fb299fa2Sopenharmony_ci class Scanner; 46fb299fa2Sopenharmony_ci class ScriptInterpreter; 47fb299fa2Sopenharmony_ci } 48fb299fa2Sopenharmony_ci 49fb299fa2Sopenharmony_ci} 50fb299fa2Sopenharmony_ci 51fb299fa2Sopenharmony_ci%code top 52fb299fa2Sopenharmony_ci{ 53fb299fa2Sopenharmony_ci /* 尽可能放在parser.cpp靠近头部的地方,与requires相似 */ 54fb299fa2Sopenharmony_ci #include <iostream> 55fb299fa2Sopenharmony_ci #include "scanner.h" 56fb299fa2Sopenharmony_ci #include "parser.hpp" 57fb299fa2Sopenharmony_ci #include "script_interpreter.h" 58fb299fa2Sopenharmony_ci #include "log.h" 59fb299fa2Sopenharmony_ci 60fb299fa2Sopenharmony_ci /* 注意:这里的参数由%parse-param决定 */ 61fb299fa2Sopenharmony_ci static Uscript::Parser::symbol_type yylex(Uscript::Scanner* scanner, Uscript::ScriptInterpreter* interpreter){ 62fb299fa2Sopenharmony_ci return scanner->nextToken(); 63fb299fa2Sopenharmony_ci } 64fb299fa2Sopenharmony_ci 65fb299fa2Sopenharmony_ci using namespace std; 66fb299fa2Sopenharmony_ci using namespace Uscript; 67fb299fa2Sopenharmony_ci using namespace Updater; 68fb299fa2Sopenharmony_ci} 69fb299fa2Sopenharmony_ci 70fb299fa2Sopenharmony_ci%{ 71fb299fa2Sopenharmony_civoid Parser::error (const location_type& loc, const std::string& msg) 72fb299fa2Sopenharmony_ci{ 73fb299fa2Sopenharmony_ci LOG(Updater::ERROR) << "error " << msg << " loc " << loc << std::endl; 74fb299fa2Sopenharmony_ci} 75fb299fa2Sopenharmony_ci%} 76fb299fa2Sopenharmony_ci 77fb299fa2Sopenharmony_ci/*定义parser传给scanner的参数*/ 78fb299fa2Sopenharmony_ci%lex-param { Uscript::Scanner* scanner } 79fb299fa2Sopenharmony_ci%lex-param { Uscript::ScriptInterpreter* interpreter } 80fb299fa2Sopenharmony_ci 81fb299fa2Sopenharmony_ci/*定义interpreter传给parser的参数*/ 82fb299fa2Sopenharmony_ci%parse-param { Uscript::Scanner* scanner } 83fb299fa2Sopenharmony_ci%parse-param { Uscript::ScriptInterpreter* interpreter } 84fb299fa2Sopenharmony_ci 85fb299fa2Sopenharmony_ci%locations 86fb299fa2Sopenharmony_ci 87fb299fa2Sopenharmony_ci/*详细显示错误信息*/ 88fb299fa2Sopenharmony_ci%define parse.error verbose 89fb299fa2Sopenharmony_ci 90fb299fa2Sopenharmony_ci/*通过Marker::Parser::make_XXX(loc)给token添加前缀*/ 91fb299fa2Sopenharmony_ci%define api.token.prefix {TOKEN_} 92fb299fa2Sopenharmony_ci 93fb299fa2Sopenharmony_ci%token <int> NUMBER 94fb299fa2Sopenharmony_ci%token <float> FLOAT 95fb299fa2Sopenharmony_ci 96fb299fa2Sopenharmony_ci%token EOL 97fb299fa2Sopenharmony_ci%token END 0 98fb299fa2Sopenharmony_ci 99fb299fa2Sopenharmony_ci%token <string>VAR FUNCTION GLOBAL FOR WHILE IF ELSE ADD SUB MUL DIV ASSIGN AND OR 100fb299fa2Sopenharmony_ci EQ NE GT GE LT LE LP RP LC RC SEMICOLON IDENTIFIER 101fb299fa2Sopenharmony_ci BREAK CONTINUE RETURN COMMA STRING 102fb299fa2Sopenharmony_ci 103fb299fa2Sopenharmony_ci%type <ScriptParams*>arglist 104fb299fa2Sopenharmony_ci 105fb299fa2Sopenharmony_ci%type <ScriptFunction*>function_definition 106fb299fa2Sopenharmony_ci 107fb299fa2Sopenharmony_ci%type <UScriptExpression*> definition_or_statement 108fb299fa2Sopenharmony_ci expression value_expression compare_expression add_sub_expression mul_div_expression 109fb299fa2Sopenharmony_ci primary_expression expression_option arg 110fb299fa2Sopenharmony_ci 111fb299fa2Sopenharmony_ci%type <UScriptStatementList*> block statement_list 112fb299fa2Sopenharmony_ci 113fb299fa2Sopenharmony_ci%type <UScriptStatement*> expression_statement return_statement continue_statement break_statement 114fb299fa2Sopenharmony_ci for_statement while_statement statement if_statement 115fb299fa2Sopenharmony_ci 116fb299fa2Sopenharmony_ci%% 117fb299fa2Sopenharmony_citranslation_unit: definition_or_statement 118fb299fa2Sopenharmony_ci | translation_unit definition_or_statement 119fb299fa2Sopenharmony_ci ; 120fb299fa2Sopenharmony_cidefinition_or_statement:function_definition 121fb299fa2Sopenharmony_ci { 122fb299fa2Sopenharmony_ci interpreter->AddFunction($1); 123fb299fa2Sopenharmony_ci } 124fb299fa2Sopenharmony_ci |statement 125fb299fa2Sopenharmony_ci { 126fb299fa2Sopenharmony_ci interpreter->AddStatement($1); 127fb299fa2Sopenharmony_ci } 128fb299fa2Sopenharmony_ci ; 129fb299fa2Sopenharmony_cifunction_definition: FUNCTION IDENTIFIER LP arglist RP block 130fb299fa2Sopenharmony_ci { 131fb299fa2Sopenharmony_ci $$ = ScriptFunction::CreateInstance($2, $4, $6); 132fb299fa2Sopenharmony_ci } 133fb299fa2Sopenharmony_ci | 134fb299fa2Sopenharmony_ci FUNCTION IDENTIFIER LP RP block 135fb299fa2Sopenharmony_ci { 136fb299fa2Sopenharmony_ci $$ = ScriptFunction::CreateInstance($2, nullptr, $5); 137fb299fa2Sopenharmony_ci } 138fb299fa2Sopenharmony_ci ; 139fb299fa2Sopenharmony_cistatement:expression_statement 140fb299fa2Sopenharmony_ci { 141fb299fa2Sopenharmony_ci $$ = $1; 142fb299fa2Sopenharmony_ci } 143fb299fa2Sopenharmony_ci |for_statement 144fb299fa2Sopenharmony_ci { 145fb299fa2Sopenharmony_ci $$ = $1; 146fb299fa2Sopenharmony_ci } 147fb299fa2Sopenharmony_ci |while_statement 148fb299fa2Sopenharmony_ci { 149fb299fa2Sopenharmony_ci $$ = $1; 150fb299fa2Sopenharmony_ci } 151fb299fa2Sopenharmony_ci |if_statement 152fb299fa2Sopenharmony_ci { 153fb299fa2Sopenharmony_ci $$ = $1; 154fb299fa2Sopenharmony_ci } 155fb299fa2Sopenharmony_ci |break_statement 156fb299fa2Sopenharmony_ci { 157fb299fa2Sopenharmony_ci $$ = $1; 158fb299fa2Sopenharmony_ci } 159fb299fa2Sopenharmony_ci |continue_statement 160fb299fa2Sopenharmony_ci { 161fb299fa2Sopenharmony_ci $$ = $1; 162fb299fa2Sopenharmony_ci } 163fb299fa2Sopenharmony_ci |return_statement 164fb299fa2Sopenharmony_ci { 165fb299fa2Sopenharmony_ci $$ = $1; 166fb299fa2Sopenharmony_ci } 167fb299fa2Sopenharmony_ci ; 168fb299fa2Sopenharmony_ciexpression_statement:expression SEMICOLON 169fb299fa2Sopenharmony_ci { 170fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateExpressionStatement($1); 171fb299fa2Sopenharmony_ci } 172fb299fa2Sopenharmony_ci ; 173fb299fa2Sopenharmony_ciexpression: value_expression 174fb299fa2Sopenharmony_ci { 175fb299fa2Sopenharmony_ci $$ = $1; 176fb299fa2Sopenharmony_ci } 177fb299fa2Sopenharmony_ci |IDENTIFIER ASSIGN expression 178fb299fa2Sopenharmony_ci { 179fb299fa2Sopenharmony_ci $$ = AssignExpression::CreateExpression($1, $3); 180fb299fa2Sopenharmony_ci } 181fb299fa2Sopenharmony_ci |IDENTIFIER COMMA IDENTIFIER ASSIGN expression 182fb299fa2Sopenharmony_ci { 183fb299fa2Sopenharmony_ci $$ = AssignExpression::CreateExpression($1, $5); 184fb299fa2Sopenharmony_ci AssignExpression::AddIdentifier($$, $3); 185fb299fa2Sopenharmony_ci } 186fb299fa2Sopenharmony_ci |IDENTIFIER COMMA IDENTIFIER COMMA IDENTIFIER ASSIGN expression 187fb299fa2Sopenharmony_ci { 188fb299fa2Sopenharmony_ci $$ = AssignExpression::CreateExpression($1, $7); 189fb299fa2Sopenharmony_ci AssignExpression::AddIdentifier($$, $3); 190fb299fa2Sopenharmony_ci AssignExpression::AddIdentifier($$, $5); 191fb299fa2Sopenharmony_ci } 192fb299fa2Sopenharmony_ci |IDENTIFIER COMMA IDENTIFIER COMMA IDENTIFIER COMMA IDENTIFIER ASSIGN expression 193fb299fa2Sopenharmony_ci { 194fb299fa2Sopenharmony_ci $$ = AssignExpression::CreateExpression($1, $9); 195fb299fa2Sopenharmony_ci AssignExpression::AddIdentifier($$, $3); 196fb299fa2Sopenharmony_ci AssignExpression::AddIdentifier($$, $5); 197fb299fa2Sopenharmony_ci AssignExpression::AddIdentifier($$, $7); 198fb299fa2Sopenharmony_ci } 199fb299fa2Sopenharmony_ci ; 200fb299fa2Sopenharmony_civalue_expression: compare_expression 201fb299fa2Sopenharmony_ci { 202fb299fa2Sopenharmony_ci $$ = $1; 203fb299fa2Sopenharmony_ci } 204fb299fa2Sopenharmony_ci |value_expression EQ compare_expression 205fb299fa2Sopenharmony_ci { 206fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::EQ_OPERATOR, $1, $3); 207fb299fa2Sopenharmony_ci } 208fb299fa2Sopenharmony_ci |value_expression NE compare_expression 209fb299fa2Sopenharmony_ci { 210fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::NE_OPERATOR, $1, $3); 211fb299fa2Sopenharmony_ci } 212fb299fa2Sopenharmony_ci |value_expression AND compare_expression 213fb299fa2Sopenharmony_ci { 214fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::AND_OPERATOR, $1, $3); 215fb299fa2Sopenharmony_ci } 216fb299fa2Sopenharmony_ci |value_expression OR compare_expression 217fb299fa2Sopenharmony_ci { 218fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::OR_OPERATOR, $1, $3); 219fb299fa2Sopenharmony_ci } 220fb299fa2Sopenharmony_ci ; 221fb299fa2Sopenharmony_cicompare_expression:add_sub_expression 222fb299fa2Sopenharmony_ci { 223fb299fa2Sopenharmony_ci $$ = $1; 224fb299fa2Sopenharmony_ci } 225fb299fa2Sopenharmony_ci |compare_expression GT add_sub_expression 226fb299fa2Sopenharmony_ci { 227fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::GT_OPERATOR, $1, $3); 228fb299fa2Sopenharmony_ci } 229fb299fa2Sopenharmony_ci |compare_expression GE add_sub_expression 230fb299fa2Sopenharmony_ci { 231fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::GE_OPERATOR, $1, $3); 232fb299fa2Sopenharmony_ci } 233fb299fa2Sopenharmony_ci |compare_expression LT add_sub_expression 234fb299fa2Sopenharmony_ci { 235fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::LT_OPERATOR, $1, $3); 236fb299fa2Sopenharmony_ci } 237fb299fa2Sopenharmony_ci |compare_expression LE add_sub_expression 238fb299fa2Sopenharmony_ci { 239fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::LE_OPERATOR, $1, $3); 240fb299fa2Sopenharmony_ci } 241fb299fa2Sopenharmony_ci ; 242fb299fa2Sopenharmony_ciadd_sub_expression:mul_div_expression 243fb299fa2Sopenharmony_ci { 244fb299fa2Sopenharmony_ci $$ = $1; 245fb299fa2Sopenharmony_ci } 246fb299fa2Sopenharmony_ci |add_sub_expression ADD mul_div_expression 247fb299fa2Sopenharmony_ci { 248fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::ADD_OPERATOR, $1, $3); 249fb299fa2Sopenharmony_ci } 250fb299fa2Sopenharmony_ci |add_sub_expression SUB mul_div_expression 251fb299fa2Sopenharmony_ci { 252fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::SUB_OPERATOR, $1, $3); 253fb299fa2Sopenharmony_ci } 254fb299fa2Sopenharmony_ci ; 255fb299fa2Sopenharmony_cimul_div_expression:primary_expression 256fb299fa2Sopenharmony_ci { 257fb299fa2Sopenharmony_ci $$ = $1; 258fb299fa2Sopenharmony_ci } 259fb299fa2Sopenharmony_ci |mul_div_expression DIV primary_expression 260fb299fa2Sopenharmony_ci { 261fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::DIV_OPERATOR, $1, $3); 262fb299fa2Sopenharmony_ci } 263fb299fa2Sopenharmony_ci |mul_div_expression MUL primary_expression 264fb299fa2Sopenharmony_ci { 265fb299fa2Sopenharmony_ci $$ = BinaryExpression::CreateExpression(UScriptExpression::MUL_OPERATOR, $1, $3); 266fb299fa2Sopenharmony_ci } 267fb299fa2Sopenharmony_ci ; 268fb299fa2Sopenharmony_ciprimary_expression:SUB primary_expression 269fb299fa2Sopenharmony_ci { 270fb299fa2Sopenharmony_ci $$=$2; 271fb299fa2Sopenharmony_ci } 272fb299fa2Sopenharmony_ci |LP expression RP 273fb299fa2Sopenharmony_ci { 274fb299fa2Sopenharmony_ci $$=$2; 275fb299fa2Sopenharmony_ci } 276fb299fa2Sopenharmony_ci |IDENTIFIER 277fb299fa2Sopenharmony_ci { 278fb299fa2Sopenharmony_ci $$ = IdentifierExpression::CreateExpression($1); 279fb299fa2Sopenharmony_ci } 280fb299fa2Sopenharmony_ci |STRING 281fb299fa2Sopenharmony_ci { 282fb299fa2Sopenharmony_ci $$ = StringExpression::CreateExpression($1); 283fb299fa2Sopenharmony_ci } 284fb299fa2Sopenharmony_ci |NUMBER 285fb299fa2Sopenharmony_ci { 286fb299fa2Sopenharmony_ci $$ = IntegerExpression::CreateExpression($1); 287fb299fa2Sopenharmony_ci } 288fb299fa2Sopenharmony_ci |FLOAT 289fb299fa2Sopenharmony_ci { 290fb299fa2Sopenharmony_ci $$ = FloatExpression::CreateExpression($1); 291fb299fa2Sopenharmony_ci } 292fb299fa2Sopenharmony_ci |IDENTIFIER LP RP 293fb299fa2Sopenharmony_ci { 294fb299fa2Sopenharmony_ci $$ = FunctionCallExpression::CreateExpression($1, nullptr); 295fb299fa2Sopenharmony_ci } 296fb299fa2Sopenharmony_ci |IDENTIFIER LP arglist RP 297fb299fa2Sopenharmony_ci { 298fb299fa2Sopenharmony_ci $$ = FunctionCallExpression::CreateExpression($1, $3); 299fb299fa2Sopenharmony_ci } 300fb299fa2Sopenharmony_ci ; 301fb299fa2Sopenharmony_cistatement_list:statement_list statement 302fb299fa2Sopenharmony_ci { 303fb299fa2Sopenharmony_ci $1->AddScriptStatement($2); 304fb299fa2Sopenharmony_ci $$ = $1; 305fb299fa2Sopenharmony_ci } 306fb299fa2Sopenharmony_ci |statement 307fb299fa2Sopenharmony_ci { 308fb299fa2Sopenharmony_ci $$ = UScriptStatementList::CreateInstance($1); 309fb299fa2Sopenharmony_ci } 310fb299fa2Sopenharmony_ci ; 311fb299fa2Sopenharmony_ciblock:LC RC 312fb299fa2Sopenharmony_ci { 313fb299fa2Sopenharmony_ci $$=nullptr; 314fb299fa2Sopenharmony_ci } 315fb299fa2Sopenharmony_ci |LC statement_list RC 316fb299fa2Sopenharmony_ci { 317fb299fa2Sopenharmony_ci $$=$2; 318fb299fa2Sopenharmony_ci } 319fb299fa2Sopenharmony_ci ; 320fb299fa2Sopenharmony_ciarglist:arglist COMMA arg 321fb299fa2Sopenharmony_ci { 322fb299fa2Sopenharmony_ci $$ = ScriptParams::AddParams($1, $3); 323fb299fa2Sopenharmony_ci } 324fb299fa2Sopenharmony_ci |arg 325fb299fa2Sopenharmony_ci { 326fb299fa2Sopenharmony_ci $$ = ScriptParams::CreateParams($1); 327fb299fa2Sopenharmony_ci } 328fb299fa2Sopenharmony_ci ; 329fb299fa2Sopenharmony_ciarg: value_expression 330fb299fa2Sopenharmony_ci { 331fb299fa2Sopenharmony_ci $$ = $1; 332fb299fa2Sopenharmony_ci } 333fb299fa2Sopenharmony_ci ; 334fb299fa2Sopenharmony_ciexpression_option: 335fb299fa2Sopenharmony_ci { 336fb299fa2Sopenharmony_ci $$=nullptr; 337fb299fa2Sopenharmony_ci } 338fb299fa2Sopenharmony_ci |expression 339fb299fa2Sopenharmony_ci { 340fb299fa2Sopenharmony_ci $$ = $1; 341fb299fa2Sopenharmony_ci } 342fb299fa2Sopenharmony_ci ; 343fb299fa2Sopenharmony_cifor_statement: FOR LP expression_option SEMICOLON expression_option SEMICOLON expression_option RP block 344fb299fa2Sopenharmony_ci { 345fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateForStatement($3,$5,$7,$9); 346fb299fa2Sopenharmony_ci } 347fb299fa2Sopenharmony_ci ; 348fb299fa2Sopenharmony_ciwhile_statement: WHILE LP expression_option RP block 349fb299fa2Sopenharmony_ci { 350fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateWhileStatement($3, (UScriptStatementList*)$5); 351fb299fa2Sopenharmony_ci } 352fb299fa2Sopenharmony_ci ; 353fb299fa2Sopenharmony_ciif_statement: IF LP expression RP block 354fb299fa2Sopenharmony_ci { 355fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateIfStatement($3,$5); 356fb299fa2Sopenharmony_ci } 357fb299fa2Sopenharmony_ci | IF LP expression RP block ELSE if_statement 358fb299fa2Sopenharmony_ci { 359fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateIfStatement($3,$5, nullptr, $7); 360fb299fa2Sopenharmony_ci } 361fb299fa2Sopenharmony_ci | IF LP expression RP block ELSE block 362fb299fa2Sopenharmony_ci { 363fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateIfStatement($3,$5, $7); 364fb299fa2Sopenharmony_ci } 365fb299fa2Sopenharmony_ci ; 366fb299fa2Sopenharmony_cibreak_statement:BREAK SEMICOLON 367fb299fa2Sopenharmony_ci { 368fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateStatement(UScriptStatement::STATEMENT_TYPE_BREAK); 369fb299fa2Sopenharmony_ci } 370fb299fa2Sopenharmony_ci ; 371fb299fa2Sopenharmony_cicontinue_statement:CONTINUE SEMICOLON 372fb299fa2Sopenharmony_ci { 373fb299fa2Sopenharmony_ci //$$=create_Statement(STATEMENT_TYPE_CONTINUE); 374fb299fa2Sopenharmony_ci $$ = UScriptStatement::CreateStatement(UScriptStatement::STATEMENT_TYPE_CONTINUE); 375fb299fa2Sopenharmony_ci } 376fb299fa2Sopenharmony_ci ; 377fb299fa2Sopenharmony_cireturn_statement:RETURN arglist SEMICOLON 378fb299fa2Sopenharmony_ci { 379fb299fa2Sopenharmony_ci $$ = UScriptReturnStatement::CreateStatement($2); 380fb299fa2Sopenharmony_ci } 381fb299fa2Sopenharmony_ci | RETURN SEMICOLON 382fb299fa2Sopenharmony_ci { 383fb299fa2Sopenharmony_ci $$ = UScriptReturnStatement::CreateStatement(nullptr); 384fb299fa2Sopenharmony_ci } 385fb299fa2Sopenharmony_ci ;