Skip to content

Commit d880152

Browse files
committed
start adding v45 keywords
1 parent 0c6ffde commit d880152

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

frontends/lexer.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,7 +2095,13 @@ getSpinToken(LexStream *L, AST **ast_ptr)
20952095
} else if (c == ':') {
20962096
peekc = lexgetc(L);
20972097
if (peekc == '=') {
2098-
c = SP_ASSIGN;
2098+
peekc = lexgetc(L);
2099+
if (peekc == ':') {
2100+
c = SP_SWAP_OP; /* :=: swap operator */
2101+
} else {
2102+
lexungetc(L, peekc);
2103+
c = SP_ASSIGN;
2104+
}
20992105
} else if (isIdentifierStart(peekc) && InDatBlock(L)) {
21002106
lexungetc(L, peekc);
21012107
if (gl_p2) {
@@ -2437,10 +2443,14 @@ struct reservedword_soft {
24372443
{ "longs", SP_LONGS, 42, 42 },
24382444
{ "words", SP_WORDS, 42, 42 },
24392445

2440-
/* new v44 keywords */
2441-
{ "fill", SP_FILL, 44, 0 },
2442-
{ "copy", SP_COPY, 44, 0 },
2443-
{ "swap", SP_SWAP, 44, 0 },
2446+
/* new v44 keywords, taken away in v45 */
2447+
{ "fill", SP_FILL, 44, 44 },
2448+
{ "copy", SP_COPY, 44, 44 },
2449+
{ "swap", SP_SWAP, 44, 44 },
2450+
2451+
/* new v45 keywords */
2452+
{ "sizeof", SP_SIZEOF, 45, 0 },
2453+
{ "struct", SP_STRUCT, 45, 0 },
24442454

24452455
};
24462456

frontends/spin/spin.y

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,11 @@ SpinDeclareStruct(AST *ident, AST *defs)
393393
%token SP_SWAP "SWAP"
394394
%token SP_COMP "COMP"
395395

396+
/* v45 additions */
397+
%token SP_STRUCT "STRUCT"
398+
%token SP_SIZEOF "SIZEOF"
399+
%token SP_SWAP_OP ":=:"
400+
396401
/* operators */
397402
%token SP_ASSIGN ":="
398403
%token SP_XOR "XOR (^^)"
@@ -478,7 +483,7 @@ SpinDeclareStruct(AST *ident, AST *defs)
478483
%token SP_DAT_RBRACK "] in DAT"
479484

480485
/* operator precedence */
481-
%right SP_ASSIGN
486+
%right SP_ASSIGN SP_SWAP_OP
482487
%left '\\'
483488
%right SP_THEN
484489
%right SP_ELSE
@@ -1070,6 +1075,14 @@ conline:
10701075
SpinDeclareStruct(name, defs);
10711076
$$ = NULL;
10721077
}
1078+
| SP_STRUCT SP_IDENTIFIER '(' structlist ')' SP_EOLN
1079+
{
1080+
/* basically an inline object definition */
1081+
AST *defs = $4;
1082+
AST *name = $2;
1083+
SpinDeclareStruct(name, defs);
1084+
$$ = NULL;
1085+
}
10731086
| SP_IDENTIFIER '(' string optobjparams ')' SP_EOLN
10741087
{
10751088
/* basically an inline object definition */
@@ -1954,6 +1967,29 @@ expr:
19541967
{ $$ = $1; }
19551968
| SP_IF expr SP_THEN expr SP_ELSE expr
19561969
{ $$ = NewAST(AST_CONDRESULT, $2, NewAST(AST_THENELSE, $4, $6)); }
1970+
| lhs SP_SWAP_OP expr
1971+
{
1972+
AST *dst = $1;
1973+
AST *src = $3;
1974+
AST *check = NewAST(AST_STATIC_ASSERT,
1975+
NewAST(AST_SAMETYPES,
1976+
NewAST(AST_TYPEOF, dst, NULL),
1977+
NewAST(AST_TYPEOF, src, NULL)),
1978+
AstStringPtr("Parameters to :=: must have the same type"));
1979+
AST *dstptr = NewAST(AST_ADDROF, dst, NULL);
1980+
AST *srcptr = NewAST(AST_ADDROF, src, NULL);
1981+
AST *copyparams = NewAST(AST_EXPRLIST,
1982+
dstptr,
1983+
NewAST(AST_EXPRLIST,
1984+
srcptr,
1985+
NewAST(AST_EXPRLIST,
1986+
NewAST(AST_SIZEOF, src, NULL),
1987+
NULL)));
1988+
AST *copy = NewAST(AST_FUNCCALL,
1989+
AstIdentifier("__builtin_swapdata"),
1990+
copyparams);
1991+
$$ = NewAST(AST_SEQUENCE, check, copy);
1992+
}
19571993
;
19581994

19591995
lhs: identifier

0 commit comments

Comments
 (0)