сделал литералы массива, тип массива, обращение к элементу массива

master2
serr 2025-05-20 20:28:01 +03:00
parent 3c31489253
commit 85405e614a
7 changed files with 89 additions and 24 deletions

View File

@ -100,6 +100,8 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
"}" { return RBRACE; } "}" { return RBRACE; }
"(" { return LPAREN; } "(" { return LPAREN; }
")" { return RPAREN; } ")" { return RPAREN; }
"[" { return LBRACK; }
"]" { return RBRACK; }
"," { return COMMA; } "," { return COMMA; }
";" { return SEMICOLON; } ";" { return SEMICOLON; }
"..." { return DOTS; } "..." { return DOTS; }

View File

@ -21,7 +21,7 @@ void free_node(char *str) {
double num; double num;
} }
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA COLON DOTS %token SHORT_DECLARATION LBRACE RBRACE LBRACK RBRACK SEMICOLON ASSIGN LPAREN RPAREN COMMA COLON DOTS
%token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT %token VAR FUNC RETURN STRING_LITERAL FLOAT_LITERAL COMPLEX_LITERAL NUMBER PACKAGE IMPORT
%token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ %token INC DEC PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ
%token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ %token AMPERSAND_EQ PIPE_EQ XOR_EQ LSHIFT_EQ RSHIFT_EQ AND_NOT_EQ
@ -66,6 +66,9 @@ statement:
{ printf("\033[1;33mSTATEMENT: variable declaration\033[0m\n"); } { printf("\033[1;33mSTATEMENT: variable declaration\033[0m\n"); }
| var_multiple_short_declaration SEMICOLON | var_multiple_short_declaration SEMICOLON
{ printf("\033[1;33mSTATEMENT: variable multiple declaration\033[0m\n"); } { printf("\033[1;33mSTATEMENT: variable multiple declaration\033[0m\n"); }
| any_identifier ASSIGN math_expr SEMICOLON
| any_identifier ASSIGN literal SEMICOLON
| var_multiple_short_assignment SEMICOLON
| func_declaration | func_declaration
{ printf("\033[1;33mSTATEMENT: function declaration\033[0m\n"); } { printf("\033[1;33mSTATEMENT: function declaration\033[0m\n"); }
| type_delcaration SEMICOLON | type_delcaration SEMICOLON
@ -85,13 +88,14 @@ block:
any_identifier: any_identifier:
IDENTIFIER IDENTIFIER
| WITH_DOT_IDENTIFIER | WITH_DOT_IDENTIFIER
| arr_element
// //
// lists // lists
statements_list: statements_list:
| statements_list expr SEMICOLON
| statements_list statement | statements_list statement
| statements_list block | statements_list block
| statements_list expr SEMICOLON
; ;
identifiers_list: identifiers_list:
@ -99,7 +103,7 @@ identifiers_list:
| identifiers_list COMMA IDENTIFIER { } | identifiers_list COMMA IDENTIFIER { }
any_identifiers_list: any_identifiers_list:
| any_identifier { } any_identifier { }
| any_identifiers_list COMMA any_identifier { } | any_identifiers_list COMMA any_identifier { }
math_expr_or_literals_list: math_expr_or_literals_list:
@ -114,6 +118,10 @@ math_expr_or_literals_list:
math_expr_or_literals_list_or_empty: math_expr_or_literals_list_or_empty:
| math_expr_or_literals_list | math_expr_or_literals_list
literals_list:
literal
| literals_list COMMA literal
types_list: types_list:
| type | type
| types_list COMMA type | types_list COMMA type
@ -293,6 +301,7 @@ func_types:
type: type:
int_types { } int_types { }
| arr_types { }
| struct_types { } | struct_types { }
| func_types { } | func_types { }
| string_types { } | string_types { }
@ -307,6 +316,7 @@ type:
// literals // literals
literal: literal:
STRING_LITERAL { } STRING_LITERAL { }
| arr_literal { }
| struct_literal { } | struct_literal { }
| func_literal { } | func_literal { }
| COMPLEX_LITERAL { } | COMPLEX_LITERAL { }
@ -339,6 +349,28 @@ import_list:
; ;
// //
// arrays
// для случая arr5 := [4]int{1: 42, 3: 99}; с частичным указанием значений
arr_field:
NUMBER COLON math_expr
| NUMBER COLON literal
arr_field_list:
| arr_field
| arr_field_list COMMA arr_field
arr_literal:
LBRACK NUMBER RBRACK type LBRACE math_expr_or_literals_list_or_empty RBRACE
| LBRACK DOTS RBRACK type LBRACE math_expr_or_literals_list_or_empty RBRACE
| LBRACK NUMBER RBRACK type LBRACE arr_field_list RBRACE
arr_types:
LBRACK NUMBER RBRACK type
arr_element:
IDENTIFIER LBRACK NUMBER RBRACK
// functions // functions
func_literal: func_literal:
@ -395,6 +427,11 @@ struct_literal:
| any_identifier LBRACE math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); } | any_identifier LBRACE math_expr_or_literals_list RBRACE { printf("STRUCT LITERAL\n"); }
// //
// assignment
var_multiple_short_assignment:
identifiers_list ASSIGN math_expr_or_literals_list
// vars decl // vars decl
var_multiple_short_declaration: var_multiple_short_declaration:
identifiers_list SHORT_DECLARATION math_expr_or_literals_list identifiers_list SHORT_DECLARATION math_expr_or_literals_list

View File

@ -1,10 +1,5 @@
package main package main
import (
"fmt"
"log"
)
type person struct { type person struct {
name, second_name string name, second_name string
age int age int
@ -27,23 +22,25 @@ func ujas() (func() func() func() int, int, string) {
}, 1, "hello world" }, 1, "hello world"
} }
func main() { func main() {
a := "Tom" var a, b int
a, b = 1, 1
fmt.Println(a) // a := "Tom"
arr := []int{1, 2, 3} // fmt.Println(a)
for idx, val := range arr { // arr := []int{1, 2, 3}
fmt.Println(idx, val) // for idx, val := range arr {
} // fmt.Println(idx, val)
// }
defer func() { // defer func() {
if err := recover(); err != nil { // if err := recover(); err != nil {
log.Println("work failed:", err) // log.Println("work failed:", err)
} // }
}() // }()
func(msg string) { // func(msg string) {
fmt.Println("Message:", msg) // fmt.Println("Message:", msg)
}("Hello, IIFE!") // }("Hello, IIFE!")
return // return
} }

22
tests/test_arrays.txt Normal file
View File

@ -0,0 +1,22 @@
package main;
func main() {
// Явное указание размера и значений
arr := [4]int{3, 2, 5, 4};
// Автовычисление размера
arr := [...]int{3, 2, 5, 4};
// Частичное определение: все не определенные элементы - zero-values
arr8 := [3]int{};
arr6 := [3]bool{true};
arr5 := [4]int{1: 42, 3: 99};
//
var arr7 [4]int;
arr7 = [4]int{1,2,3,4};
arr7, arr8 = [4]int{1,2,3,4}, [4]int{1,2,3,4};
// Изменение элемента массива
arr[1];
arr[1] = 2+2*2;
arr[1] = [4]int{3, 2, 5, 4};
arr[1] = "test";
}

View File

@ -57,7 +57,7 @@ func main() {
} }
for i := 10; i > 0; i-- { } for i := 10; i > 0; i-- { }
a = 1; a = 1;
a = s; a = test;
s := "test string"; s := "test string";

View File

@ -15,6 +15,9 @@ func iife(work int) {
log.SetPrefix(fmt.Sprintf("%s | ", app.Cfg.ServerDomain)); log.SetPrefix(fmt.Sprintf("%s | ", app.Cfg.ServerDomain));
cache := candycache.Cacher(10 * time.Minute);
cache.Set("key7", -2.1231, 10*time.Minute);
router := setupRoutes(app); router := setupRoutes(app);
if app, err = models.InitApp(); err != nil { if app, err = models.InitApp(); err != nil {

View File

@ -16,6 +16,10 @@ func test() {
var a, b, c, d = 1,2,3,4; var a, b, c, d = 1,2,3,4;
var a, b, c, d int = 1,2,3,4; var a, b, c, d int = 1,2,3,4;
a = 123;
s = "string";
a, b := 1, 2; // декларация нескольких переменных (целые литералы) a, b := 1, 2; // декларация нескольких переменных (целые литералы)
a, b := b, a; // swap a, b := b, a; // swap
a, b := "hello", "sailor"; // декларация нескольких переменных (строковые литералы) a, b := "hello", "sailor"; // декларация нескольких переменных (строковые литералы)