From a2fb31ab5a94fad1da857d90cc5beb8cbde1a141 Mon Sep 17 00:00:00 2001 From: bronku Date: Sun, 30 Nov 2025 11:41:42 +0100 Subject: [PATCH] pora na 300+ --- src/ast/statements.hpp | 16 ++++++++++++++++ src/lexer.l | 2 ++ src/parser.y | 8 +++++++- test/parser/28.out | 3 +-- test/parser/29.out | 3 +-- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/ast/statements.hpp b/src/ast/statements.hpp index eccaff6..533d5a7 100644 --- a/src/ast/statements.hpp +++ b/src/ast/statements.hpp @@ -67,6 +67,22 @@ struct Pass : Stmt } }; +struct Break : Stmt +{ + std::string dump(int indent = 0) const override + { + return indent_str(indent) + "Break"; + } +}; + +struct Continue : Stmt +{ + std::string dump(int indent = 0) const override + { + return indent_str(indent) + "Continue"; + } +}; + // #todo elif struct If : Stmt { diff --git a/src/lexer.l b/src/lexer.l index 1aa4919..56e02db 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -50,6 +50,8 @@ else { return yy::parser::token::TOK_KW_ELSE; } elif { return yy::parser::token::TOK_KW_ELIF; } class { return yy::parser::token::TOK_KW_CLASS; } while { return yy::parser::token::TOK_KW_WHILE; } +break { return yy::parser::token::TOK_KW_BREAK; } +continue { return yy::parser::token::TOK_KW_CONTINUE; } \=\= { return yy::parser::token::TOK_EQ; } \!\= { return yy::parser::token::TOK_NE; } diff --git a/src/parser.y b/src/parser.y index 8ff40ec..71ba858 100644 --- a/src/parser.y +++ b/src/parser.y @@ -32,7 +32,7 @@ %left KW_OR %left KW_AND %right KW_NOT // unary logical NOT -%token KW_DEF KW_IF KW_RETURN KW_FOR KW_IN KW_PASS KW_ELSE KW_ELIF KW_CLASS KW_WHILE +%token KW_DEF KW_IF KW_RETURN KW_FOR KW_IN KW_PASS KW_ELSE KW_ELIF KW_CLASS KW_WHILE KW_BREAK KW_CONTINUE %token L_PAREN R_PAREN L_BRACKET R_BRACKET L_BRACE R_BRACE %token DOT COLON SEMICOLON COMMA @@ -100,6 +100,12 @@ stmt: | KW_PASS NEWLINE { $$ = std::make_unique(); } + | KW_BREAK NEWLINE { + $$ = std::make_unique(); + } + | KW_CONTINUE NEWLINE { + $$ = std::make_unique(); + } | KW_WHILE expr COLON NEWLINE INDENT stmt_list DEDENT { $$ = std::make_unique(std::move($2), std::move($6)); } diff --git a/test/parser/28.out b/test/parser/28.out index 4d64170..61d3980 100644 --- a/test/parser/28.out +++ b/test/parser/28.out @@ -3,5 +3,4 @@ Module Identifier(y) If Identifier(x) - Break - + Break \ No newline at end of file diff --git a/test/parser/29.out b/test/parser/29.out index a083fab..2e61525 100644 --- a/test/parser/29.out +++ b/test/parser/29.out @@ -3,5 +3,4 @@ Module Identifier(y) If Identifier(x) - Continue - + Continue \ No newline at end of file