9 static void yyerror (const char *, ...);
10 extern int yylex (void);
11 static bool __yyaccept__ (int, bool);
12 static bool yyexpect (int);
18 char *__token = yytoken_string (sym); \
19 printf ("[%i:%s]\n", sym, __token); \
23 # define yylex_() yylex ()
26 static std::vector
<ALLOCA_
> * alloca_modifiers (void);
28 static rdot
type (void);
29 static rdot
target (void);
30 static rdot
suite (void);
31 static rdot
else_block (void);
32 static rdot
elif_block (void);
33 static rdot
if_block (void);
34 static rdot
struct_conditional (void);
35 static rdot
primary (void);
36 static rdot
factor1 (void);
37 static rdot
factor2 (void);
38 static rdot
expression (void);
40 static vec
<rdot
, va_gc
> * symStack
;
41 static const char * token_strings
[] = {
86 yytoken_string (int token
)
89 memset (retval
, 0, 128);
90 if (token
>= 258 && token
<= 298)
91 strncpy (retval
, token_strings
[token
-258-1], 128);
93 retval
[0] = (char) token
;
94 return xstrdup (retval
);
97 #define yyaccept(_X) __yyaccept__ (_X, true)
98 #define yyaccept_(_X) __yyaccept__ (_X, false)
100 bool __yyaccept__ (int s
, bool forward
)
114 bool yyexpect (int s
)
117 if (yyaccept (s
) == true)
121 char * e1
= yytoken_string (s
);
122 char * e2
= yytoken_string (sym
);
123 yyerror ("expected [%s] got [%s]", e1
, e2
);
130 /* Also realy need to make use of location_t and gcc diagnostics .. */
131 /* this is really hacky but its ok for now really need to fix this though */
132 static void __attribute__ ((format (printf
, 1, 2)))
133 yyerror (const char * fmt
, ...)
136 char * buffer
= (char *) alloca (512);
137 memset (buffer
, 0, 512);
141 vsprintf (buffer
, fmt
, vl
);
144 char * buffer_message
= (char *) alloca (512);
145 memset (buffer_message
, 0, 512);
146 snprintf (buffer_message
, 512, "syntax error at %i: [%s]", yylineno
, buffer
);
148 fatal_error ("%s", buffer_message
);
151 std::vector
<ALLOCA_
> * alloca_modifiers (void)
153 std::vector
<ALLOCA_
> * allocas
= new std::vector
<ALLOCA_
>;
154 while (sym
== '~' || sym
== '&' || sym
== '*')
172 allocas
->push_back (mod
);
179 std::vector
<ALLOCA_
> * mem
= alloca_modifiers ();
180 rdot retval
= NULL_DOT
;
181 if (yyaccept (TYPE_INT
))
182 retval
= rdot_build_decl1 (RTYPE_INT
, NULL_DOT
);
183 else if (yyaccept (TYPE_UINT
))
184 retval
= rdot_build_decl1 (RTYPE_UINT
, NULL_DOT
);
185 else if (yyaccept (TYPE_FLOAT
))
186 retval
= rdot_build_decl1 (RTYPE_FLOAT
, NULL_DOT
);
187 else if (yyaccept (TYPE_BOOL
))
188 retval
= rdot_build_decl1 (RTYPE_BOOL
, NULL_DOT
);
189 else if (yyaccept (IDENTIFIER
))
191 char * sid
= yylval
.string
;
192 retval
= rdot_build_decl1 (RTYPE_USER_STRUCT
,
193 rdot_build_identifier (sid
));
197 yyerror ("expected a type got [%s]", yytoken_string (sym
));
199 RDOT_MMEM_COPY (mem
, RDOT_MEM_MODIFIER (retval
));
212 yyexpect (IDENTIFIER
);
213 char * tid
= yylval
.string
;
215 rdot ltype
= NULL_DOT
;
218 if (ltype
== NULL_DOT
)
219 ltype
= rdot_build_decl1 (RTYPE_INFER
, NULL_DOT
);
221 rdot retval
= rdot_build_varDecl (ltype
, qual
,
222 rdot_build_identifier (tid
));
227 void argument_list_ (rdot head
)
232 rdot p
= expression ();
233 if (head
== NULL_DOT
)
234 vec_safe_push (symStack
, p
);
236 RDOT_CHAIN (head
) = p
;
242 rdot
argument_list ()
244 rdot retval
= NULL_DOT
;
245 size_t prev
= symStack
->length ();
246 argument_list_ (NULL_DOT
);
247 size_t next
= symStack
->length ();
250 retval
= symStack
->pop ();
256 yyexpect (IDENTIFIER
);
257 char * selem
= yylval
.string
;
259 rdot expr
= expression ();
260 rdot retval
= rdot_build_decl2 (D_STRUCT_PARAM
,
261 rdot_build_identifier (selem
),
267 void struct_init_list_ (rdot head
)
271 rdot e
= struct_elem ();
272 if (head
== NULL_DOT
)
273 vec_safe_push (symStack
, e
);
275 RDOT_CHAIN (head
) = e
;
277 struct_init_list_ (e
);
280 rdot
struct_init_list (void)
282 rdot retval
= NULL_DOT
;
283 size_t prev
= symStack
->length ();
284 struct_init_list_ (NULL_DOT
);
285 size_t next
= symStack
->length ();
288 retval
= symStack
->pop ();
294 rdot retval
= NULL_DOT
;
295 std::vector
<ALLOCA_
> * mem
= alloca_modifiers ();
296 if (yyaccept (IDENTIFIER
))
299 char * pid
= yylval
.string
;
303 rdot alist
= argument_list ();
305 retval
= rdot_build_decl2 (D_CALL_EXPR
,
306 rdot_build_identifier (pid
),
310 else if (yyaccept_ ('{'))
313 rdot sls
= struct_init_list ();
315 retval
= rdot_build_decl2 (D_STRUCT_INIT
,
316 rdot_build_identifier (pid
),
319 // just a simple identifier...
321 retval
= rdot_build_identifier (pid
);
324 else if (yyaccept (INTEGER
))
325 retval
= rdot_build_integer (yylval
.integer
);
326 else if (yyaccept (FLOAT
))
327 retval
= rdot_build_float (yylval
.ffloat
);
328 else if (yyaccept (STRING
))
329 retval
= rdot_build_string (yylval
.string
);
330 else if (yyaccept (XFALSE
))
331 retval
= rdot_build_bool (false);
332 else if (yyaccept (XTRUE
))
333 retval
= rdot_build_bool (true);
335 yyerror ("expected a primary got [%s]", yytoken_string (sym
));
337 RDOT_MMEM_COPY (mem
, RDOT_MEM_MODIFIER (retval
));
344 rdot retval
= NULL_DOT
;
345 if (yyaccept (IDENTIFIER
))
347 char * pid
= yylval
.string
;
350 rdot rhs
= expression ();
351 retval
= rdot_build_decl2 (D_MODIFY_EXPR
, rdot_build_identifier (pid
), rhs
);
353 else if (yyaccept_ ('('))
356 rdot alist
= argument_list ();
358 retval
= rdot_build_decl2 (D_CALL_EXPR
,
359 rdot_build_identifier (pid
),
363 else if (yyaccept_ ('{'))
366 rdot sls
= struct_init_list ();
368 retval
= rdot_build_decl2 (D_STRUCT_INIT
,
369 rdot_build_identifier (pid
),
372 else if (yyaccept_ (ACC
))
375 rdot node
= factor1 ();
376 retval
= rdot_build_decl2 (D_ACC_EXPR
, rdot_build_identifier (pid
), node
);
380 retval
= rdot_build_identifier (yylval
.string
);
383 rdot rhs
= factor2 ();
384 retval
= rdot_build_decl2 (D_ATTRIB_REF
, retval
, rhs
);
396 rdot retval
= NULL_DOT
;
399 retval
= expression ();
405 if (RDOT_TYPE (retval
) == D_IDENTIFIER
406 || RDOT_TYPE (retval
) == D_CALL_EXPR
)
410 rdot rhs
= factor2 ();
411 retval
= rdot_build_decl2 (D_ATTRIB_REF
, retval
, rhs
);
418 opcode_t
symToDeclType (int sym
)
420 opcode_t retval
= D_D_EXPR
;
424 retval
= D_MODIFY_EXPR
;
432 retval
= D_MINUS_EXPR
;
436 retval
= D_MULT_EXPR
;
440 retval
= D_DIVD_EXPR
;
444 retval
= D_ATTRIB_REF
;
448 retval
= D_EQ_EQ_EXPR
;
452 retval
= D_NOT_EQ_EXPR
;
456 retval
= D_LESS_EXPR
;
460 retval
= D_LESS_EQ_EXPR
;
464 retval
= D_GREATER_EXPR
;
468 retval
= D_GREATER_EQ_EXPR
;
472 yyerror ("invalid symbol [%i:%s]",
473 sym
, yytoken_string (sym
));
479 rdot
expression (void)
482 rdot retval
= factor1 ();
483 rdot next
= NULL_DOT
;
484 while (sym
== '+' || sym
== '-' ||
485 sym
== '*' || sym
== '/' ||
486 sym
== '<' || sym
== '>' ||
487 sym
== EQUAL_EQUAL
|| sym
== NOT_EQUAL
||
488 sym
== LESS_EQUAL
|| sym
== GREATER_EQUAL
)
490 opcode_t o
= symToDeclType (sym
);
492 rdot rhs
= factor2 ();
495 retval
= next
= rdot_build_decl2 (o
, retval
, rhs
);
500 rdot prev
= RDOT_rhs_TT (next
);
501 rdot rhs_expr
= rdot_build_decl2 (o
, prev
, rhs
);
502 RDOT_rhs_TT (next
) = rhs_expr
;
511 rdot retval
= NULL_DOT
;
512 if (yyaccept_ (BREAK
))
515 retval
= rdot_build_decl1 (C_BREAK_STMT
, NULL_DOT
);
517 else if (yyaccept_ (CONTINUE
))
520 retval
= rdot_build_decl1 (C_CONT_STMT
, NULL_DOT
);
522 else if (yyaccept_ (RETURN
))
525 retval
= rdot_build_decl1 (C_RETURN_STMT
, expression ());
527 else if (yyaccept_ (LET
))
529 // simple vardecl [let x;]
533 retval
= rdot_build_decl2 (D_MODIFY_EXPR
,
540 retval
= expression ();
544 rdot
struct_while_loop ()
547 rdot expr
= expression ();
551 return rdot_build_decl2 (D_STRUCT_WHILE
, expr
, sb
);
560 return rdot_build_decl1 (D_STRUCT_LOOP
, sb
);
566 rdot expr
= expression ();
570 return rdot_build_decl2 (D_STRUCT_IF
, expr
, sb
);
573 rdot
elif_block (void)
576 rdot expr
= expression ();
580 return rdot_build_decl2 (D_STRUCT_IF
, expr
, sb
);
583 rdot
else_block (void)
587 rdot block
= suite ();
589 return rdot_build_decl1 (D_STRUCT_ELSE
, block
);
592 rdot
struct_conditional ()
594 rdot iblock
= if_block ();
595 rdot eblock
= NULL_DOT
;
596 rdot elblock
= NULL_DOT
;
597 rdot curr
= NULL_DOT
;
598 rdot prev
= NULL_DOT
;
599 while (yyaccept_ (ELIF
))
601 curr
= elif_block ();
602 if (elblock
== NULL_DOT
)
603 elblock
= prev
= curr
;
606 RDOT_CHAIN (prev
) = curr
;
610 if (yyaccept_ (ELSE
))
611 eblock
= else_block ();
612 rdot retval
= rdot_build_decl2 (D_STRUCT_IF
, iblock
, eblock
);
613 RDOT_FIELD (retval
)= elblock
;
617 void statement_list (rdot head
)
623 if (yyaccept_ (LOOP
))
625 else if (yyaccept_ (WHILE
))
626 st
= struct_while_loop ();
627 else if (yyaccept_ (IF
))
628 st
= struct_conditional ();
633 DOT_RETVAL (st
) = true;
635 gcc_assert (st
!= NULL_DOT
);
636 if (head
== NULL_DOT
)
637 vec_safe_push (symStack
, st
);
639 RDOT_CHAIN (head
) = st
;
645 rdot retval
= NULL_DOT
;
646 size_t prev
= symStack
->length ();
647 statement_list (NULL
);
648 size_t next
= symStack
->length ();
651 retval
= symStack
->pop ();
657 yyexpect (IDENTIFIER
);
658 char * pid
= yylval
.string
;
661 rdot retval
= rdot_build_decl2 (D_PARAMETER
,
662 rdot_build_identifier (pid
),
668 void param_list_ (rdot head
)
674 if (head
== NULL_DOT
)
675 vec_safe_push (symStack
, p
);
677 RDOT_CHAIN (head
) = p
;
685 rdot retval
= NULL_DOT
;
686 size_t prev
= symStack
->length ();
687 param_list_ (NULL_DOT
);
688 size_t next
= symStack
->length ();
691 retval
= symStack
->pop ();
695 /* fndecl := [pub] fn IDENTIFIER ([param_list]) [-> type] { stmt_list } */
702 yyexpect (IDENTIFIER
);
703 char * fid
= yylval
.string
;
705 rdot plist
= param_list ();
707 rdot rtype
= NULL_DOT
;
708 if (yyaccept (RTYPE
))
711 rdot block
= suite ();
713 rdot retval
= rdot_build_fndecl (rdot_build_identifier (fid
),
714 pub
, plist
, rtype
, block
);
719 void struct_layout_ (rdot head
)
725 if (head
== NULL_DOT
)
726 vec_safe_push (symStack
, p
);
728 RDOT_CHAIN (head
) = p
;
734 rdot
struct_layout ()
736 rdot retval
= NULL_DOT
;
737 size_t prev
= symStack
->length ();
738 struct_layout_ (NULL_DOT
);
739 size_t next
= symStack
->length ();
742 retval
= symStack
->pop ();
749 yyexpect (IDENTIFIER
);
750 char * sid
= yylval
.string
;
753 rdot layout
= struct_layout ();
755 rdot retval
= rdot_build_decl2 (D_STRUCT_TYPE
,
756 rdot_build_identifier (sid
),
762 void fndecl_block_ (rdot head
)
768 if (head
== NULL_DOT
)
769 vec_safe_push (symStack
, f
);
771 RDOT_CHAIN (head
) = f
;
776 rdot
fndecl_block (void)
778 rdot retval
= NULL_DOT
;
779 size_t prev
= symStack
->length ();
780 fndecl_block_ (NULL_DOT
);
781 size_t next
= symStack
->length ();
784 retval
= symStack
->pop ();
790 rdot retval
= NULL_DOT
;
792 yyexpect (IDENTIFIER
);
793 char * iid
= yylval
.string
;
794 rdot rid
= rdot_build_identifier (iid
);
797 yyexpect (IDENTIFIER
);
799 rdot fb
= fndecl_block ();
801 retval
= rdot_build_decl2 (D_STRUCT_IMPL
, rid
, fb
);
806 decl := fndecl | structdecl | impldecl | enumdecl
810 rdot rdecl
= NULL_DOT
;
811 if (yyaccept_ (STRUCT
))
812 rdecl
= struct_decl ();
813 else if (yyaccept_ (IMPL
))
814 rdecl
= impl_block ();
817 if (rdecl
!= NULL_DOT
)
818 dot_pass_pushDecl (rdecl
);
823 // kick things off with the first token
827 vec_alloc (symStack
, 0);
828 vec_safe_push (symStack
, NULL_DOT
);
833 if (symStack
->length() > 1)
834 yyerror ("some unpoped symbols on the parse stack!");