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        ;