Skip to content

Commit dc2ae50

Browse files
authored
Berry Force left bracket without spaces for calls (#24154)
1 parent d7b1bb3 commit dc2ae50

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

lib/libesp32/berry/src/be_lexer.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static const char* const kwords_tab[] = {
3636
"^=", "<<=", ">>=", "+", "-", "*", "/", "%",
3737
"<", "<=", "==", "!=", ">", ">=", "&", "|",
3838
"^", "<<", ">>", "..", "&&", "||", "!", "~",
39-
"(", ")", "[", "]", "{", "}", ".", ",", ";",
39+
"(", "(", ")", "[", "]", "{", "}", ".", ",", ";",
4040
":", "?", "->", "if", "elif", "else", "while",
4141
"for", "def", "end", "class", "break", "continue",
4242
"return", "true", "false", "nil", "var", "do",
@@ -686,6 +686,7 @@ static int skip_delimiter(blexer *lexer) {
686686
c = lgetc(lexer);
687687
delimeter_present = 1;
688688
}
689+
lexer->had_whitespace = delimeter_present;
689690
return delimeter_present;
690691
}
691692

@@ -791,12 +792,15 @@ static btokentype lexer_next(blexer *lexer)
791792
switch (lgetc(lexer)) {
792793
case '\r': case '\n': /* newline */
793794
skip_newline(lexer);
795+
lexer->had_whitespace = 1;
794796
break;
795797
case ' ': case '\t': case '\f': case '\v': /* spaces */
796798
next(lexer);
799+
lexer->had_whitespace = 1;
797800
break;
798801
case '#': /* comment */
799802
skip_comment(lexer);
803+
lexer->had_whitespace = 1;
800804
break;
801805
case EOS: return TokenEOS; /* end of source stream */
802806
/* operator */
@@ -805,7 +809,7 @@ static btokentype lexer_next(blexer *lexer)
805809
case '*': return scan_assign(lexer, OptMulAssign, OptMul);
806810
case '/': return scan_assign(lexer, OptDivAssign, OptDiv);
807811
case '%': return scan_assign(lexer, OptModAssign, OptMod);
808-
case '(': next(lexer); return OptLBK;
812+
case '(': next(lexer); return lexer->had_whitespace ? OptSpaceLBK : OptCallLBK;
809813
case ')': next(lexer); return OptRBK;
810814
case '[': next(lexer); return OptLSB;
811815
case ']': next(lexer); return OptRSB;
@@ -865,6 +869,7 @@ void be_lexer_init(blexer *lexer, bvm *vm,
865869
lexer->reader.readf = reader;
866870
lexer->reader.data = data;
867871
lexer->reader.len = 0;
872+
lexer->had_whitespace = 1; /* start with whitespace state */
868873
lexerbuf_init(lexer);
869874
keyword_registe(vm);
870875
lexer->strtab = be_map_new(vm);
@@ -892,6 +897,7 @@ int be_lexer_scan_next(blexer *lexer)
892897
return 0;
893898
}
894899
lexer->lastline = lexer->linenumber;
900+
lexer->had_whitespace = 0; /* reset whitespace flag before scanning */
895901
type = lexer_next(lexer);
896902
clear_buf(lexer);
897903
if (type != TokenNone) {

lib/libesp32/berry/src/be_lexer.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ typedef enum {
5454
OptNot, /* operator, ! */
5555
OptFlip, /* operator, ~ */
5656
/* postfix operator or bracket */
57-
OptLBK, /* operator, ( bracket */
57+
OptSpaceLBK, /* operator, ( bracket (with space/newline before) */
58+
OptCallLBK, /* operator, ( bracket (call - no space before) */
5859
OptRBK, /* operator, ) bracket */
5960
OptLSB, /* operator, [ square bracket */
6061
OptRSB, /* operator, ] square bracket */
@@ -67,6 +68,7 @@ typedef enum {
6768
OptColon, /* operator, : */
6869
OptQuestion, /* operator, ? */
6970
OptArrow, /* operator, -> */
71+
OptWalrus, /* operator, := */
7072
/* keyword */
7173
KeyIf, /* keyword if */
7274
KeyElif, /* keyword elif */
@@ -90,8 +92,6 @@ typedef enum {
9092
KeyExcept, /* keyword except */
9193
KeyRaise, /* keyword raise */
9294
KeyStatic, /* keyword static */
93-
/* Walrus operator */
94-
OptWalrus, /* operator, := */
9595
} btokentype;
9696

9797
struct blexerreader {
@@ -126,6 +126,7 @@ typedef struct blexer {
126126
struct blexerreader reader;
127127
bmap *strtab;
128128
bvm *vm;
129+
int had_whitespace; /* track if whitespace/newline preceded current token */
129130
} blexer;
130131

131132
void be_lexer_init(blexer *lexer, bvm *vm,

lib/libesp32/berry/src/be_parser.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,12 @@ static void func_varlist(bparser *parser)
595595
/* '(' [ ID {',' ID}] ')' or */
596596
/* '(' '*' ID ')' or */
597597
/* '(' [ ID {',' ID}] ',' '*' ID ')' */
598-
match_token(parser, OptLBK); /* skip '(' */
598+
btokentype type_lbk = next_type(parser);
599+
if ((type_lbk == OptSpaceLBK) || (type_lbk == OptCallLBK)) {
600+
match_token(parser, type_lbk); /* skip '(' */
601+
} else {
602+
match_token(parser, OptCallLBK); /* raise error */
603+
}
599604
if (next_type(parser) == OptMul) {
600605
func_vararg(parser);
601606
} else if (match_id(parser, str) != NULL) {
@@ -837,8 +842,8 @@ static void member_expr(bparser *parser, bexpdesc *e)
837842
init_exp(&key, ETSTRING, 0);
838843
key.v.s = str;
839844
be_code_member(parser->finfo, e, &key);
840-
} else if (next_type(parser) == OptLBK) {
841-
scan_next_token(parser); /* skip '(' */
845+
} else if (next_type(parser) == OptCallLBK) {
846+
scan_next_token(parser); /* skip '(' - must be no space before */
842847
bexpdesc key;
843848
expr(parser, &key);
844849
check_var(parser, &key);
@@ -897,7 +902,8 @@ static void simple_expr(bparser *parser, bexpdesc *e)
897902
static void primary_expr(bparser *parser, bexpdesc *e)
898903
{
899904
switch (next_type(parser)) {
900-
case OptLBK: /* '(' expr ')' */
905+
case OptSpaceLBK: /* '(' expr ')' - grouping parentheses only */
906+
case OptCallLBK: /* '(' expr ')' - following a symbol */
901907
scan_next_token(parser); /* skip '(' */
902908
expr(parser, e);
903909
check_var(parser, e);
@@ -926,7 +932,7 @@ static void suffix_expr(bparser *parser, bexpdesc *e)
926932
primary_expr(parser, e);
927933
for (;;) {
928934
switch (next_type(parser)) {
929-
case OptLBK: /* '(' function call */
935+
case OptCallLBK: /* '(' function call - no space before */
930936
call_expr(parser, e);
931937
break;
932938
case OptDot: /* '.' member */
@@ -1355,7 +1361,7 @@ static void continue_stmt(bparser *parser)
13551361
static bbool isoverloadable(btokentype type)
13561362
{
13571363
return (type >= OptAdd && type <= OptConnect) /* overloaded binary operator */
1358-
|| type == OptFlip || type == OptLBK; /* '~' and '()' operator */
1364+
|| type == OptFlip || type == OptSpaceLBK; /* '~' and '()' operator */
13591365
}
13601366

13611367
static bstring* func_name(bparser* parser, bexpdesc* e, int ismethod)
@@ -1376,7 +1382,7 @@ static bstring* func_name(bparser* parser, bexpdesc* e, int ismethod)
13761382
return parser_newstr(parser, "-*");
13771383
}
13781384
/* '()' call operator */
1379-
if (type == OptLBK && next_type(parser) == OptRBK) {
1385+
if ((type == OptSpaceLBK) && next_type(parser) == OptRBK) {
13801386
scan_next_token(parser); /* skip ')' */
13811387
return parser_newstr(parser, "()");
13821388
}

lib/libesp32/berry/tools/coc/str_build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def get_count(self): # compute the total size by adding sizes of each
6262
return size
6363

6464
def keywords(self):
65-
opif = 50
65+
opif = 52
6666
tab = {
6767
"if": opif, "elif": opif + 1 ,
6868
"else": opif + 2 , "while": opif + 3 ,

0 commit comments

Comments
 (0)