aboutsummaryrefslogtreecommitdiff
path: root/demos/sample-files/lbp.g
diff options
context:
space:
mode:
authorkartofen <kartofen.mail.0@protonmail.com>2025-09-24 00:06:54 +0300
committerkartofen <kartofen.mail.0@protonmail.com>2025-09-24 00:06:54 +0300
commitfec8e3a95becfb3dc2a3eb0f512a120a7a4551c5 (patch)
tree8d3da9f0c3fa36f5e06bc49cc1bfdc0db3099ea1 /demos/sample-files/lbp.g
parentdb1b9c8dcb0d115217a33c2fe8e0760d49143e11 (diff)
debug info through the lr parser
Diffstat (limited to 'demos/sample-files/lbp.g')
-rw-r--r--demos/sample-files/lbp.g66
1 files changed, 40 insertions, 26 deletions
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; }.