добавил возможную экспоненциальную часть к числам

master2
serr 2025-05-18 18:59:13 +03:00
parent b2de5ce92c
commit be95ad05e3
4 changed files with 52 additions and 12 deletions

View File

@ -13,6 +13,7 @@ void yyerror(const char *s) {
%} %}
EXPONENT [eE][+-]?{DIGIT}+
DIGIT [0-9] DIGIT [0-9]
LETTER [a-zA-Z_] LETTER [a-zA-Z_]
LETTER_OR_DIGIT [a-zA-Z0-9_] LETTER_OR_DIGIT [a-zA-Z0-9_]
@ -129,21 +130,25 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
} }
} }
{DIGIT}+\.{DIGIT}*i { /* Комплексные числа: 123.456i */ {DIGIT}+\.{DIGIT}*{EXPONENT}?i {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
return COMPLEX_LITERAL; return COMPLEX_LITERAL;
} }
{DIGIT}+i { /* Комплексные числа: 123i */ {DIGIT}+{EXPONENT}?i {
yylval.str = strdup(yytext); yylval.str = strdup(yytext);
return COMPLEX_LITERAL; return COMPLEX_LITERAL;
} }
{DIGIT}+\.{DIGIT}+ { /* Обычные float: 123.456 */ {DIGIT}+\.{DIGIT}*{EXPONENT}? {
return FLOAT_LITERAL; return FLOAT_LITERAL;
} }
{DIGIT}+ { /* Целые числа */ {DIGIT}+{EXPONENT} {
return FLOAT_LITERAL;
}
{DIGIT}+ {
return NUMBER; return NUMBER;
} }

View File

@ -191,12 +191,25 @@ continue_statement:
expr: expr:
RETURN math_expr_or_literals_list_or_empty { printf("\033[1;35mRETURN math expr\033[0m\n") } RETURN math_expr_or_literals_list_or_empty { printf("\033[1;35mRETURN math expr\033[0m\n") }
| RETURN literal { printf("\033[1;35mRETURN literal\033[0m\n") } | RETURN literal { printf("\033[1;35mRETURN literal\033[0m\n") }
| IDENTIFIER ASSIGN math_expr { }
| math_expr { } | math_expr { }
; ;
math_expr: math_expr:
math_expr PLUS math_expr { printf("PLUS\n"); } IDENTIFIER ASSIGN math_expr { }
| IDENTIFIER PLUS_EQ math_expr
| IDENTIFIER MINUS_EQ math_expr
| IDENTIFIER MUL_EQ math_expr
| IDENTIFIER DIV_EQ math_expr
| IDENTIFIER MOD_EQ math_expr
| IDENTIFIER AMPERSAND_EQ math_expr
| IDENTIFIER PIPE_EQ math_expr
| IDENTIFIER XOR_EQ math_expr
| IDENTIFIER LSHIFT_EQ math_expr
| IDENTIFIER RSHIFT_EQ math_expr
| IDENTIFIER AND_NOT_EQ math_expr
| math_expr PLUS math_expr { printf("PLUS\n"); }
| math_expr MINUS math_expr { printf("MINUS\n"); } | math_expr MINUS math_expr { printf("MINUS\n"); }
| math_expr MULT math_expr { printf("MULT\n"); } | math_expr MULT math_expr { printf("MULT\n"); }
| math_expr DIV math_expr { printf("DIV\n"); } | math_expr DIV math_expr { printf("DIV\n"); }

View File

@ -3,7 +3,8 @@ package main
import "fmt" import "fmt"
func main() { func main() {
a := 1e6
fmt.Println(a)
arr := []int{1, 2, 3} arr := []int{1, 2, 3}
for idx, val := range arr { for idx, val := range arr {
fmt.Println(idx, val) fmt.Println(idx, val)

View File

@ -5,7 +5,24 @@ import (
"log"; "log";
) )
// A toy implementation of cube root using Newton's method.
func CubeRoot(x float64) float64 {
z := x/3; // Arbitrary initial value
for i := 0; i < 1e6; i++ {
prevz := z;
z -= (z*z*z-x) / (3*z*z);
if veryClose(z, prevz) {
return z;
}
}
// A million iterations has not converged; something is wrong.
panic(fmt.Sprintf("CubeRoot(%g) did not converge", x));
}
func test() { func test() {
z -= (z*z*z-x) / (3*z*z);
return "123"; return "123";
} }
@ -18,7 +35,11 @@ func test(a int, b string) {
func main() { func main() {
var a int; var a int;
a = 2+2*2-(1+10)+213i*2 - 2.123i; var c complex128 = 555.12i+1.123i;
a := 123+123e45 + 123.456 +123.456e-78+123i+123.456e10i;
a = 2+2*2-(1+10)+213i*2 - 2.123i - c;
a = a + 1; a = a + 1;
a = a; a = a;
} }