From add49f1df854ed333252b494d1899c8c899991dd Mon Sep 17 00:00:00 2001 From: Shinya Sato Date: Thu, 10 Mar 2022 21:10:34 +0900 Subject: v0.8.1-1 --- src/ast.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'src/ast.c') diff --git a/src/ast.c b/src/ast.c index 8b894f6..88a40ff 100644 --- a/src/ast.c +++ b/src/ast.c @@ -308,9 +308,9 @@ void ast_puts(Ast *p) { } -Ast *ast_unfoldABR(Ast *left, char *sym, Ast *paramlist) { +Ast *ast_unfoldABR(Ast *left_params, char *sym, Ast *paramlist) { // input: - // left << (AST_AGENT, sym, paramlist) + // left_params << (AST_AGENT, sym, paramlist) // output: // p1,p2,...,pn << (AST_AGENT, sym, params @ [param]) @@ -318,6 +318,16 @@ Ast *ast_unfoldABR(Ast *left, char *sym, Ast *paramlist) { // where left = (AST_AGENT sym, p1,p2,...,pn,params) // right = (AST_NAME param) + if (!strcmp(sym, "Merger")) { + // left << Merger(paramlist) ==> Merger(left) ~ (paramlist) + Ast *agent_left = ast_makeAST(AST_AGENT, ast_makeSymbol("Merger"), + left_params); + Ast *agent_right = ast_makeTuple(paramlist); + Ast *cnct = ast_makeAST(AST_CNCT, agent_left, agent_right); + return cnct; + } + + if (!strcmp(sym, "Append")) { // paramlist: [a,b] => [b,a] if (paramlist->right != NULL) { @@ -325,13 +335,8 @@ Ast *ast_unfoldABR(Ast *left, char *sym, Ast *paramlist) { paramlist->left = paramlist->right->left; // a := b paramlist->right->left = tmp; // b := a } - } else if (!strcmp(sym, "Merger")) { - // left << Merger(paramlist) ==> Merger(left) ~ (paramlist) - Ast *agent_left = ast_makeAST(AST_AGENT, ast_makeSymbol("Merger"), left); - Ast *agent_right = ast_makeTuple(paramlist); - Ast *cnct = ast_makeAST(AST_CNCT, agent_left, agent_right); - return cnct; } + //ast_puts(left);puts(""); //ast_puts(paramlist);puts(""); @@ -363,19 +368,23 @@ Ast *ast_unfoldABR(Ast *left, char *sym, Ast *paramlist) { // ast_puts(param);puts(""); - // make left as left@params - at = left; - while (at != NULL) { - if (at->right == NULL) { - at->right = params; - break; + // make left_params as left_params @ params + at = left_params; + if (at == NULL) { + at = params; + } else { + while (at != NULL) { + if (at->right == NULL) { + at->right = params; + break; + } + at = at->right; } - at = at->right; } // ast_puts(left);puts(""); - Ast *agent_left = ast_makeAST(AST_AGENT, ast_makeSymbol(sym), left); + Ast *agent_left = ast_makeAST(AST_AGENT, ast_makeSymbol(sym), left_params); Ast *agent_right = param; Ast *cnct = ast_makeAST(AST_CNCT, agent_left, agent_right); -- cgit v1.2.3