добавил FROM_PACKAGE_IDENTIFIER - обращение к чему то в каком то пакете

все что берется из другого пакета выглядит так <имя_пакета.Название>, где Название всегда с большой буквы
master2
serr 2025-05-18 17:55:24 +03:00
parent 3fbd10ea34
commit 2973ff1f2f
5 changed files with 42 additions and 23 deletions

View File

@ -14,6 +14,7 @@ void yyerror(const char *s) {
%} %}
DIGIT [0-9] DIGIT [0-9]
BIG_LETTER [A-Z]
LETTER [a-zA-Z_] LETTER [a-zA-Z_]
LETTER_OR_DIGIT [a-zA-Z0-9_] LETTER_OR_DIGIT [a-zA-Z0-9_]
@ -117,10 +118,14 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
return STRING_LITERAL; return STRING_LITERAL;
} }
{LETTER}{LETTER_OR_DIGIT}* { {LETTER}{LETTER_OR_DIGIT}*(\.{BIG_LETTER}{LETTER_OR_DIGIT}*)? {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
if (strchr(yytext, '.') != NULL) {
return FROM_PACKAGE_IDENTIFIER;
} else {
return IDENTIFIER; return IDENTIFIER;
} }
}
[0-9]+\.[0-9]+ { [0-9]+\.[0-9]+ {
return FLOAT_LITERAL; return FLOAT_LITERAL;

View File

@ -34,7 +34,7 @@ void free_node(char *str) {
%token RUNE BYTE BOOL_LITERAL %token RUNE BYTE BOOL_LITERAL
%token FLOAT32 FLOAT64 %token FLOAT32 FLOAT64
%token COMPLEX64 COMPLEX128 %token COMPLEX64 COMPLEX128
%token <str> IDENTIFIER %token <str> IDENTIFIER FROM_PACKAGE_IDENTIFIER
%token AND OR NOT EQ NEQ LT GT LEQ GEQ %token AND OR NOT EQ NEQ LT GT LEQ GEQ
%left PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ %left PLUS_EQ MINUS_EQ MUL_EQ DIV_EQ MOD_EQ
@ -93,13 +93,16 @@ identifiers_list:
math_expr_or_literals_list: math_expr_or_literals_list:
literal { } literal { }
| math_expr_or_literals_list COMMA literal
| math_expr { } | math_expr { }
| func_call { }
| math_expr_or_literals_list COMMA literal
| math_expr_or_literals_list COMMA math_expr | math_expr_or_literals_list COMMA math_expr
| math_expr_or_literals_list COMMA func_call
;
math_expr_or_literals_list_or_empty: math_expr_or_literals_list_or_empty:
| math_expr_or_literals_list | math_expr_or_literals_list
// //
// condition // condition
@ -199,6 +202,7 @@ math_expr:
| IDENTIFIER { printf("IDENTIFIER: %s\n", $1); } | IDENTIFIER { printf("IDENTIFIER: %s\n", $1); }
| IDENTIFIER INC { printf("POST-INCREMENT: %s++\n", $1); } | IDENTIFIER INC { printf("POST-INCREMENT: %s++\n", $1); }
| IDENTIFIER DEC { printf("POST-DECREMENT: %s--\n", $1); } | IDENTIFIER DEC { printf("POST-DECREMENT: %s--\n", $1); }
| func_call { printf("FUNCTION CALL IN EXPR\n"); }
; ;
log_expr: log_expr:
@ -285,9 +289,9 @@ import_list:
// //
// functions // functions
func_call: func_call:
IDENTIFIER LPAREN math_expr_or_literals_list_or_empty RPAREN IDENTIFIER LPAREN math_expr_or_literals_list_or_empty RPAREN
| FROM_PACKAGE_IDENTIFIER LPAREN math_expr_or_literals_list_or_empty RPAREN
arg_declaration: arg_declaration:
IDENTIFIER type IDENTIFIER type

View File

@ -1,17 +1,9 @@
package main package main
import "fmt" func test(a int) int {
return a
const ( }
a = "123123"
b = "123123"
)
func main() { func main() {
panic(test(test(1)*2 + 1))
for k, l := 0, 10; k < l; k, l = k+1, l-1 {
}
fmt.Println(a, b)
} }

14
tests/test_func_calls.txt Normal file
View File

@ -0,0 +1,14 @@
package main;
import (
"fmt";
)
func test(a int) int {
return a;
}
func main() {
a := test(1); // вызов функции обычной
fmt.Println(test(test(1)*2+3 - a)); // вызов функции из fmt
}

View File

@ -1,5 +1,9 @@
package main; package main;
func dva() {
return 2;
}
func test() { func test() {
a := 1; // декларация одной переменной (число) a := 1; // декларация одной переменной (число)
@ -8,7 +12,7 @@ func test() {
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"; // декларация нескольких переменных (строковые литералы)
a, b, c, d := "hello", 2, 3.123, true; // декларация нескольких переменных (всякое) a, b, c, d, v := "hello", 2, 3.123, true, dva(); // декларация нескольких переменных (всякое)
// цикл с множественной декларацией и множественным присвоением // цикл с множественной декларацией и множественным присвоением
for k, l := 0, 10; k < l; k, l = k+1, l-1 { for k, l := 0, 10; k < l; k, l = k+1, l-1 {