@@ -5,6 +5,50 @@ use crate::compiler::lexer::{Token, TokenType};
55use crate :: compiler:: parser:: expression:: expr_eval;
66use crate :: compiler:: parser:: { Parser , ParserError , check_char} ;
77
8+ fn parse_fill_len_expr ( parser : & mut Parser ) -> Result < ASTExprTree , ParserError > {
9+ let mut token;
10+ let mut p_count = 0 ;
11+ let mut sub_exp: Vec < Token > = Vec :: new ( ) ;
12+ loop {
13+ token = parser. next_parser_token ( ) ?;
14+ if token. t_type == Operator && token. text ( ) == "," && p_count == 0 {
15+ return Err ( ParserError :: IllegalExpression ( token) ) ;
16+ }
17+ if token. t_type == End && p_count == 0 {
18+ return Err ( ParserError :: IllegalExpression ( token) ) ;
19+ }
20+
21+ if token. t_type == LP && ( token. text ( ) == "[" || token. text ( ) == "(" || token. text ( ) == "{" )
22+ {
23+ p_count += 1 ;
24+ }
25+
26+ if token. t_type == LR {
27+ if token. text ( ) == "]" && p_count == 0 {
28+ break ;
29+ }
30+ p_count -= 1 ;
31+ }
32+
33+ sub_exp. push ( token) ;
34+ }
35+
36+ expr_eval ( parser, sub_exp) ?. ok_or ( ParserError :: IllegalTypeCombination ( token) )
37+ }
38+
39+ fn try_parse_fill_count ( expr : & ASTExprTree ) -> Result < Option < usize > , ParserError > {
40+ let ASTExprTree :: Literal ( token) = expr else {
41+ return Ok ( None ) ;
42+ } ;
43+ if token. t_type != TokenType :: Number {
44+ return Ok ( None ) ;
45+ }
46+ let count = token. value_number ( ) ;
47+ let count =
48+ usize:: try_from ( count) . map_err ( |_| ParserError :: IllegalTypeCombination ( token. clone ( ) ) ) ?;
49+ Ok ( Some ( count) )
50+ }
51+
852pub fn var_eval ( parser : & mut Parser ) -> Result < ASTStmtTree , ParserError > {
953 let mut token = parser. next_parser_token ( ) ?;
1054 if token. t_type != TokenType :: Identifier {
@@ -32,6 +76,24 @@ pub fn var_eval(parser: &mut Parser) -> Result<ASTStmtTree, ParserError> {
3276 if token. t_type == Operator && token. text ( ) == "," && p_count == 0 {
3377 break ;
3478 }
79+ if token. t_type == End && p_count == 0 {
80+ let fill_expr = match expr_eval ( parser, sub_exp) ? {
81+ None => return Err ( ParserError :: IllegalTypeCombination ( token) ) ,
82+ Some ( expr) => expr,
83+ } ;
84+ let len_expr = parse_fill_len_expr ( parser) ?;
85+ if let Some ( count) = try_parse_fill_count ( & len_expr) ? {
86+ return Ok ( ASTStmtTree :: Array {
87+ token : var_name,
88+ elements : vec ! [ fill_expr; count] ,
89+ } ) ;
90+ }
91+ return Ok ( ASTStmtTree :: ArrayFill {
92+ token : var_name,
93+ value : fill_expr,
94+ count : len_expr,
95+ } ) ;
96+ }
3597
3698 if token. t_type == LP
3799 && ( token. text ( ) == "[" || token. text ( ) == "(" || token. text ( ) == "{" )
0 commit comments