From fec8e3a95becfb3dc2a3eb0f512a120a7a4551c5 Mon Sep 17 00:00:00 2001 From: kartofen Date: Wed, 24 Sep 2025 00:06:54 +0300 Subject: debug info through the lr parser --- demos/sample-files/lbp.g | 66 +++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 26 deletions(-) (limited to 'demos/sample-files/lbp.g') diff --git a/demos/sample-files/lbp.g b/demos/sample-files/lbp.g index 1dd176c..a5532ca 100644 --- a/demos/sample-files/lbp.g +++ b/demos/sample-files/lbp.g @@ -9,18 +9,16 @@ -nonterminal S exprlist expr sym fieldlist basetype subtypelist. -stacktype { union { + struct ast_expr expr; + int num; char *str; - struct ast_vrbl vrbl; - struct ast_fiel fiel; - struct ast_decl decl; - struct ast_defn defn; - struct ast_oprn oprn; - - struct ast_expr expr; - struct ast_strlist strlist; + struct strlist strlist; struct list_head *list; + + struct { int type; char *iden; } basetype; + struct { int type; struct list_head *exprlist; } subtype; }}. -left LPAREN; @@ -28,28 +26,44 @@ S: exprlist DOT { v = A(0); }; -exprlist: expr { v = g_LST(A(0).expr); } +exprlist: expr { v = g_LST(A(0).expr); /* determine type??? */ } | expr exprlist { v = g_LST(A(0).expr); v.list->next = A(1).list; } - | exprlist COMMA exprlist { v = g_LST(NEW(expr, .type = AST_OPERATION, .operation = NEW(oprn, .optype = AST_OP_AND, .left_exprlist = A(0).list, .right_exprlist = A(2).list))); } - | exprlist SEMICOL exprlist { v = g_LST(NEW(expr, .type = AST_OPERATION, .operation = NEW(oprn, .optype = AST_OP_OR, .left_exprlist = A(0).list, .right_exprlist = A(2).list)));}; + | exprlist COMMA exprlist + { v = g_LST(AST(expr, .type = AST_OPERATION, .operation = + AST(oprn, .optype = AST_OP_AND, .left_exprlist = A(0).list, .right_exprlist = A(2).list))); } + | exprlist SEMICOL exprlist + { v = g_LST(AST(expr, .type = AST_OPERATION, .operation = + AST(oprn, .optype = AST_OP_OR, .left_exprlist = A(0).list, .right_exprlist = A(2).list)));}; -expr: NUM { v = g_NEW(expr, .type = AST_NUMBER, .number = A(0).num); } - | sym { v = g_NEW(expr, .type = AST_VARIABLE, .variable = A(0).vrbl); } - | sym fieldlist { v = g_NEW(expr, .type = AST_FIELDLIST, .fieldlist = NEW(fiel, .variable = A(0).vrbl, .fields_strlist = A(1).list)); } - | sym TYPELIST_START basetype TYPELIST_END { v = g_NEW(expr, .type = AST_VARIABLE, .variable = A(0).vrbl); } - | sym TYPELIST_START basetype subtypelist TYPELIST_END { v = g_NEW(expr, .type = AST_VARIABLE, .variable = A(0).vrbl); } - | LBRACE exprlist DOT RBRACE { v = g_NEW(expr, .type = AST_PARENLIST, .paren_exprlist = A(1).list); } - | LPAREN exprlist RPAREN { v = g_NEW(expr, .type = AST_PARENLIST, .paren_exprlist = A(1).list); }; +expr: NUM { v = g_AST(expr, .type = AST_NUMBER, .number = A(0).num); } + | sym { v = g_AST(expr, .type = AST_VARIABLE, .variable = A(0).vrbl); } + | sym fieldlist + { v = g_AST(expr, .type = AST_FIELDLIST, .fieldlist = AST(fiel, .variable = A(0).vrbl, .fields_strlist = A(1).list)); } + | sym TYPELIST_START basetype TYPELIST_END + { v = g_AST(expr, .type = AST_DECLARATION, .variable = A(0).vrbl, + .datatype = NEW(datatype, .typeflags = A(2).basetype.type, + .iden = A(2).basetype.iden)); } + | sym TYPELIST_START basetype subtypelist TYPELIST_END + { v = g_AST(expr, .type = AST_DECLARATION, .variable = A(0).vrbl, + .datatype = NEW(datatype, .typeflags = TYPEFLAGS(A(2).basetype.type, A(3).subtype.type), + .iden = A(2).basetype.iden, + .function_exprlist = A(3).subtype.exprlist)); } + | LBRACE exprlist DOT RBRACE { v = g_AST(expr, .type = AST_BRACELIST, .exprlist = A(1).list); } + | LPAREN exprlist RPAREN { v = g_AST(expr, .type = AST_PARENLIST, .exprlist = A(1).list); }; -sym: IDEN { v = g_NEW(vrbl, .is_atom = 0, .iden = A(0).str); } - | ATOM { v = g_NEW(vrbl, .is_atom = 1, .iden = A(0).str); }; +sym: IDEN { v = g_AST(vrbl, .is_atom = 0, .iden = A(0).str); } + | ATOM { v = g_AST(vrbl, .is_atom = 1, .iden = A(0).str); }; fieldlist: COLON IDEN { v = g_LST(NEW(strlist, .str = A(1).str)); } | fieldlist fieldlist { A(0).list->next = A(1).list; v = A(0); }; -basetype: T_INT {} - | T_STRUCT {} | T_STRUCT LPAREN ATOM RPAREN {} - | T_ENUM {} | T_ENUM LPAREN ATOM RPAREN {}; -subtypelist: ST_FUNCTION LPAREN exprlist RPAREN {} - | ST_BIG {} | ST_LITTLE {} | ST_NATIVE {} - | subtypelist subtypelist {}. +basetype: T_INT { v = g_NEW(basetype, .type = DATATYPE_INT); } + | T_STRUCT { v = g_NEW(basetype, .type = DATATYPE_STRUCT); } + | T_ENUM { v = g_NEW(basetype, .type = DATATYPE_ENUM); } + | T_STRUCT LPAREN ATOM RPAREN { v = g_NEW(basetype, .type = DATATYPE_STRUCT, .iden = A(2).str); } + | T_ENUM LPAREN ATOM RPAREN { v = g_NEW(basetype, .type = DATATYPE_ENUM, .iden = A(2).str); }; +subtypelist: ST_FUNCTION LPAREN exprlist RPAREN { v = g_NEW(subtype, .type = SUBTYPE_FUNCTION, .exprlist = A(2).list); } + | ST_BIG { v = g_NEW(subtype, .type = SUBTYPE_BIG); } + | ST_LITTLE { v = g_NEW(subtype, .type = SUBTYPE_LITTLE); } + | ST_NATIVE { v = g_NEW(subtype, .type = SUBTYPE_NATIVE); } + | subtypelist subtypelist { v = A(1); v.subtype.type |= A(0).subtype.type; if(A(0).subtype.exprlist) v.subtype.exprlist = A(0).subtype.exprlist; }. -- cgit v1.2.3