до убирания ненужных стрдапов и тд
parent
f36476bf34
commit
f5f9256e8f
|
@ -37,6 +37,11 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
"return" { return RETURN; }
|
"return" { return RETURN; }
|
||||||
":=" { return SHORT_DECLARATION; }
|
":=" { return SHORT_DECLARATION; }
|
||||||
"=" { return ASSIGN; }
|
"=" { return ASSIGN; }
|
||||||
|
"+" { return PLUS; }
|
||||||
|
"-" { return MINUS; }
|
||||||
|
"*" { return MULT; }
|
||||||
|
"/" { return DIV; }
|
||||||
|
"%" { return MOD; }
|
||||||
"{" { return LBRACE; }
|
"{" { return LBRACE; }
|
||||||
"}" { return RBRACE; }
|
"}" { return RBRACE; }
|
||||||
"(" { return LPAREN; }
|
"(" { return LPAREN; }
|
||||||
|
@ -45,7 +50,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
";" { return SEMICOLON; }
|
";" { return SEMICOLON; }
|
||||||
|
|
||||||
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол
|
\"([^"\\]|\\.)*\" { // правило для строк с возможность экранирования через \спецсимвол
|
||||||
yylval.str = strdup(yytext);
|
// yylval.str = strdup(yytext);
|
||||||
return STRING_LITERAL;
|
return STRING_LITERAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +65,7 @@ LETTER_OR_DIGIT [a-zA-Z0-9_]
|
||||||
}
|
}
|
||||||
|
|
||||||
{DIGIT}+ {
|
{DIGIT}+ {
|
||||||
yylval.str = strdup(yytext);
|
yylval.num = atoi(yytext);
|
||||||
return NUMBER;
|
return NUMBER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
extern int yylineno;
|
extern int yylineno;
|
||||||
extern char *yytext;
|
extern char *yytext;
|
||||||
|
@ -17,18 +18,27 @@ void free_node(char *str) {
|
||||||
|
|
||||||
%union {
|
%union {
|
||||||
char *str;
|
char *str;
|
||||||
|
double num;
|
||||||
}
|
}
|
||||||
|
|
||||||
%token <str> IDENTIFIER NUMBER TEXT STRING_LITERAL FLOAT_LITERAL
|
|
||||||
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA
|
%token SHORT_DECLARATION LBRACE RBRACE SEMICOLON ASSIGN LPAREN RPAREN COMMA
|
||||||
%token VAR FUNC RETURN
|
%token VAR FUNC RETURN
|
||||||
|
%token PLUS MINUS MULT DIV MOD EXP
|
||||||
%token STRING
|
%token STRING
|
||||||
%token UINT UINT8 UINT16 UINT32 UINT64
|
%token UINT UINT8 UINT16 UINT32 UINT64
|
||||||
%token INT INT8 INT16 INT32 INT64
|
%token INT INT8 INT16 INT32 INT64
|
||||||
|
|
||||||
%type <str> var_declaration literal type int_types string_types
|
|
||||||
|
%token <str> IDENTIFIER STRING_LITERAL FLOAT_LITERAL
|
||||||
|
%type <str> var_declaration type int_types string_types
|
||||||
%type <str> arg_declaration return_type
|
%type <str> arg_declaration return_type
|
||||||
|
%type <num> expr literal math_expr
|
||||||
|
%token <num> NUMBER
|
||||||
|
|
||||||
|
%left PLUS MINUS
|
||||||
|
%left MULT DIV MOD
|
||||||
|
%left EXP
|
||||||
|
%left UMINUS
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -52,14 +62,26 @@ statements_list:
|
||||||
;
|
;
|
||||||
|
|
||||||
expr:
|
expr:
|
||||||
// return
|
RETURN math_expr { printf("Return: %g\n", $2); }
|
||||||
RETURN literal
|
| IDENTIFIER ASSIGN math_expr { printf("Assignment: %s = %g\n", $1, $3); free_node($1); }
|
||||||
| RETURN IDENTIFIER
|
| math_expr { $$ = $1; }
|
||||||
//
|
|
||||||
| IDENTIFIER ASSIGN literal
|
|
||||||
| IDENTIFIER ASSIGN IDENTIFIER
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
math_expr:
|
||||||
|
math_expr PLUS math_expr { $$ = $1 + $3; }
|
||||||
|
| math_expr MINUS math_expr { $$ = $1 - $3; }
|
||||||
|
| math_expr MULT math_expr { $$ = $1 * $3; }
|
||||||
|
| math_expr DIV math_expr { $$ = $1 / $3; }
|
||||||
|
| math_expr MOD math_expr { $$ = fmod($1, $3); }
|
||||||
|
| math_expr EXP math_expr { $$ = pow($1, $3); }
|
||||||
|
| MINUS math_expr %prec UMINUS { $$ = -$2; }
|
||||||
|
| LPAREN math_expr RPAREN { $$ = $2; }
|
||||||
|
| NUMBER { $$ = $1; }
|
||||||
|
| FLOAT_LITERAL { $$ = atof($1); free_node($1); }
|
||||||
|
| IDENTIFIER { $$ = 0; free_node($1); }
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Остальные правила остаются без изменений */
|
||||||
int_types:
|
int_types:
|
||||||
UINT { $$ = strdup("uint"); }
|
UINT { $$ = strdup("uint"); }
|
||||||
| UINT8 { $$ = strdup("uint8"); }
|
| UINT8 { $$ = strdup("uint8"); }
|
||||||
|
@ -83,15 +105,14 @@ type:
|
||||||
;
|
;
|
||||||
|
|
||||||
literal:
|
literal:
|
||||||
STRING_LITERAL { $$ = $1; }
|
STRING_LITERAL { $$ = 0; /* Для строк возвращаем 0 */ free_node($1); }
|
||||||
| FLOAT_LITERAL { $$ = $1; }
|
| FLOAT_LITERAL { $$ = atof($1); free_node($1); }
|
||||||
| NUMBER { $$ = $1; }
|
| NUMBER { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
// Объявление функций
|
|
||||||
arg_declaration:
|
arg_declaration:
|
||||||
IDENTIFIER type {
|
IDENTIFIER type {
|
||||||
$$ = $2; // Возвращаем только тип
|
$$ = $2;
|
||||||
printf("Argument: %s %s\n", $1, $2);
|
printf("Argument: %s %s\n", $1, $2);
|
||||||
free_node($1);
|
free_node($1);
|
||||||
}
|
}
|
||||||
|
@ -102,7 +123,6 @@ arg_list:
|
||||||
| arg_list COMMA arg_declaration
|
| arg_list COMMA arg_declaration
|
||||||
;
|
;
|
||||||
|
|
||||||
// тип
|
|
||||||
return_type:
|
return_type:
|
||||||
/* empty */ { $$ = NULL; }
|
/* empty */ { $$ = NULL; }
|
||||||
| type { $$ = $1; }
|
| type { $$ = $1; }
|
||||||
|
@ -115,11 +135,13 @@ func_declaration:
|
||||||
if ($6) free_node($6);
|
if ($6) free_node($6);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
//
|
|
||||||
|
|
||||||
// Объявление переменных
|
|
||||||
var_declaration:
|
var_declaration:
|
||||||
IDENTIFIER SHORT_DECLARATION literal {
|
IDENTIFIER SHORT_DECLARATION math_expr {
|
||||||
|
printf("Short declaration: %s := %g\n", $1, $3);
|
||||||
|
free_node($1);
|
||||||
|
}
|
||||||
|
| IDENTIFIER SHORT_DECLARATION literal {
|
||||||
printf("Short declaration: %s := %s\n", $1, $3);
|
printf("Short declaration: %s := %s\n", $1, $3);
|
||||||
free_node($1);
|
free_node($1);
|
||||||
free_node($3);
|
free_node($3);
|
||||||
|
@ -129,6 +151,11 @@ var_declaration:
|
||||||
free_node($2);
|
free_node($2);
|
||||||
free_node($3);
|
free_node($3);
|
||||||
}
|
}
|
||||||
|
| VAR IDENTIFIER type ASSIGN math_expr {
|
||||||
|
printf("Var with assign declaration: var %s %s = %g\n", $2, $3, $5);
|
||||||
|
free_node($2);
|
||||||
|
free_node($3);
|
||||||
|
}
|
||||||
| VAR IDENTIFIER type ASSIGN literal {
|
| VAR IDENTIFIER type ASSIGN literal {
|
||||||
printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5);
|
printf("Var with assign declaration: var %s %s = %s\n", $2, $3, $5);
|
||||||
free_node($2);
|
free_node($2);
|
||||||
|
@ -136,7 +163,6 @@ var_declaration:
|
||||||
free_node($5);
|
free_node($5);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
//
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ func func_without_return_type(a string) {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
a := 1;
|
a := 1 + 2;
|
||||||
{
|
{
|
||||||
|
|
||||||
a := 229.162613;
|
a := 229.162613;
|
||||||
|
@ -35,7 +35,7 @@ a := 1;
|
||||||
var a string = "123123";
|
var a string = "123123";
|
||||||
{
|
{
|
||||||
|
|
||||||
b := 2;
|
b := 2 - 1;
|
||||||
|
|
||||||
|
|
||||||
s := "123";
|
s := "123";
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
|
||||||
|
func test() {
|
||||||
|
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
var a int;
|
||||||
|
a = 2+2*2-(1+10);
|
||||||
|
a = a + 1;
|
||||||
|
a = a;
|
||||||
|
}
|
Loading…
Reference in New Issue