Пример #1
0
        public string Visit(FunDef node)
        {
            var funcName = node.AnchorToken.Lexeme;

            currentFunction = funcName;
            var sb = new StringBuilder();

            //Console.WriteLine(currentFunction);

            if (funcName == "main")
            {
                sb.Append($"  (func\n");
                sb.Append($"    (export \"main\")\n");
            }
            else
            {
                sb.Append($"  (func ${funcName}\n");
            }

            sb.Append(Visit((dynamic)node[0]));
            sb.Append($"    (result i32)\n");
            sb.Append($"    (local $_temp i32)\n");
            sb.Append(Visit((dynamic)node[1]));
            sb.Append(Visit((dynamic)node[2]));
            if (hasReturn == 0)
            {
                sb.Append($"    i32.const 0\n");
            }
            sb.Append($"  )\n");

            hasReturn       = 0;
            currentFunction = "";

            return(sb.ToString());
        }
Пример #2
0
        private void AddToStringFun(Type type)
        {
            if (!type.IsEnum)
            {
                return;
            }

            var funName = ToStringFunName(type);

            if (FunDefs.ContainsKey(funName))
            {
                return;
            }

            var caseExp = new CaseExp(new Id("v"));

            foreach (var alt in type.GetEnumNames())
            {
                caseExp.Cases.Add(new Tuple <ElmAstNode, ElmAstNode>(
                                      new Id(AdtAlternativeName(type, alt)),
                                      new StringLiteral(alt)
                                      ));
            }

            var fun = new FunDef(funName, $"{funName} : {type.Name} -> {Elm.Types.STRING}");

            fun.Params.Add("v");
            fun.Body = caseExp;

            FunDefs.Add(funName, fun);
        }
        public void Visit(FunDef node)
        {
            var funcName = node.AnchorToken.Lexeme;

            var props = FunTable[funcName];

            currentFunction = funcName;
            level++;

            props.reference = new SortedDictionary <string, string>();

            FunTable[funcName] = props;

            Visit((dynamic)node[0]);

            Visit((dynamic)node[1]);

            /*
             * foreach (var entry in FunTable[funcName].reference) {
             *  Console.WriteLine(entry);
             * }
             * Console.WriteLine("");
             */

            Visit((dynamic)node[2]);

            level--;
        }
Пример #4
0
        public string Visit(FunDef node)
        {
            insideFunction = true;
            localVariables = new SymbolTable();
            var temp1 = " ";
            var temp2 = " ";

            parameters = new FunctionTable();
            var ind = 0;

            foreach (var n in node[0])
            {
                parameters[n.AnchorToken.Lexeme] = ind;
                temp1 += "int32,";
                temp2 += Line(Indent() + ".locals init (int32 '" + n.AnchorToken.Lexeme + "')");
                localVariables.Add(n.AnchorToken.Lexeme);
                ind++;
            }

            var result = Line(Indent() + ".method public static int32 '" + node.AnchorToken.Lexeme + "'(" + temp1.Substring(0, temp1.Length - 1) + ") {");

            indentCounter++;
            if (node.AnchorToken.Lexeme == "main")
            {
                result += Line(Indent() + ".entrypoint");
            }
            result += temp2
                      + Visit((dynamic)node[1])
                      + Visit((dynamic)node[2])
                      + Line(Indent() + "ldc.i4.0")
                      + Line(Indent() + "ret");
            indentCounter--;
            insideFunction = false;
            return(result + Line(Indent() + "}") + Line(Indent()));
        }
Пример #5
0
        public Node FunDef()
        {
            //‹id›(‹id-list›?){‹var-def›* ‹stmt-list›*}
            var n = new FunDef()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            };

            Expect(TokenCategory.OPENEDPAR);
            //if(CurrentToken != TokenCategory.CLOSEDPAR){
            n.Add(IdList());
            //}
            Expect(TokenCategory.CLOSEDPAR);
            Expect(TokenCategory.OPENEDCURLY);

            //while(CurrentToken == TokenCategory.VAR){
            //n.Add(VarDef());
            //}
            n.Add(VarDefList());
            //if(firstOfStmt.Contains(CurrentToken)){
            n.Add(StmtList());
            //}
            Expect(TokenCategory.CLOSEDCURLY);
            return(n);
        }
Пример #6
0
 //-----------------------------------------------------------
 //<funDef>//
 public void Visit(FunDef node, int i)
 {
     //visits id
     Visit((dynamic)node[0], 2);
     //visits param list
     Visit((dynamic)node[1], 3);
 }
Пример #7
0
        public void AddEncodeFun(Type type)
        {
            var funName = EncodeFunName(type);

            if (FunDefs.ContainsKey(funName))
            {
                return;
            }

            var f = new FunDef(funName, $"{funName} : {type.Name} -> {Elm.Types.ENCODER_VALUE}");

            f.Params.Add("v");
            if (type.IsEnum)
            {
                var encodeApp = new FunApp(new Id(Elm.Encoders.STRING))
                {
                    Rands = { new FunApp(new Id(ToStringFunName(type)))
                              {
                                  Rands ={ new Id("v")             }
                              } }
                };

                f.Body = encodeApp;
            }
            else
            {
                var fieldTups = new List <ElmAstNode>();
                foreach (var prop in type.GetProperties(PROP_FLAGS))
                {
                    var jsonAttrs = prop.GetCustomAttributes(typeof(JsonPropertyAttribute));
                    if (jsonAttrs.FirstOrDefault() is JsonPropertyAttribute jsonAttr)
                    {
                        var jsonFieldName = jsonAttr.PropertyName ?? SnakeCase(prop.Name);
                        var keyExp        = new StringLiteral(jsonFieldName);
                        var valExp        = new FunApp(new Id(EncodeFunName(prop.PropertyType)))
                        {
                            Rands =
                            {
                                new Id($"v.{ElmRecordFieldName(prop)}")
                            }
                        };

                        fieldTups.Add(new TupleExp(keyExp, valExp));
                    }
                }

                f.Body = new FunApp(
                    new Id(Elm.Encoders.OBJECT),
                    new ListExp(fieldTups.ToArray())
                    );
            }

            FunDefs.Add(funName, f);
        }
Пример #8
0
 //-----------------------------------------------------------
 //<funDef>//
 public void Visit(FunDef node)
 {
     //visits id
     Visit((dynamic)node[0], 'f');
     //visits param list
     parameterCounter = 0;
     Visit((dynamic)node[1], 'p');
     //visits var def list
     Visit((dynamic)node[2], 'v');
     //visits stmt list
     Visit((dynamic)node[3], 's');
 }
        public void Visit(FunDef node)
        {
            var funcName = node.AnchorToken.Lexeme;

            if (FunTable.ContainsKey(funcName))
            {
                throw new SemanticError(
                          "Duplicated function: " + funcName,
                          node.AnchorToken);
            }
            else
            {
                var arity = node[0].Size();
                FunTable[funcName] = new FuncProperties(false, arity, null);
            }
        }
Пример #10
0
        public Node FunDef()
        {
            var funToken = Expect(TokenCategory.IDENTIFIER);

            Expect(TokenCategory.PARENTHESIS_OPEN);
            var parList = ParamList();

            Expect(TokenCategory.PARENTHESIS_CLOSE);
            Expect(TokenCategory.BRACKET_OPEN);
            var varDList      = VarDefList();
            var statementList = StmtList();

            Expect(TokenCategory.BRACKET_CLOSE);

            var result = new FunDef()
            {
                parList, varDList, statementList
            };

            result.AnchorToken = funToken;

            return(result);
        }
Пример #11
0
        //<fundef>//
        public Node FunDef()
        {
            var result = new FunDef();

            result.Add(new Identifier()
            {
                AnchorToken = Expect(TokenCategory.IDENTIFIER)
            });

            Expect(TokenCategory.PARENTHESIS_OPEN);

            result.Add(ParamList());

            Expect(TokenCategory.PARENTHESIS_CLOSE);
            Expect(TokenCategory.CURLY_BRACKET_OPEN);

            result.Add(VarDefList());
            result.Add(StmtList());

            Expect(TokenCategory.CURLY_BRACKET_CLOSE);

            return(result);
        }
Пример #12
0
        public void Visit(FunDef node)
        {
            var functionName = node.AnchorToken.Lexeme;

            if (firstPass)
            {
                if (Global_Function_Table.Contains(functionName))
                {
                    throw new SemanticError("Duplicated function: " + functionName, node.AnchorToken);
                }
                else
                {
                    if (node[0] is IdList)
                    {
                        var t = 0;
                        foreach (var n in node[0])
                        {
                            t++;
                        }
                        Global_Function_Table[functionName] = t;
                    }
                    else
                    {
                        Global_Function_Table[functionName] = 0;
                    }
                }
            }
            else
            {
                currentNamespaceTable = new SymbolTable();
                insideFunction        = true;
                VisitChildren(node);
                localSymbolTables[functionName] = currentNamespaceTable;
                insideFunction        = false;
                currentNamespaceTable = new SymbolTable();
            }
        }
Пример #13
0
        public void AddDecodeFun(Type type)
        {
            var funName = DecodeFunName(type);

            if (FunDefs.ContainsKey(funName))
            {
                return;
            }

            var f = new FunDef(funName, $"{funName} : {Elm.Types.DECODER} {type.Name}");

            if (type.IsEnum)
            {
                var innerFunName = $"{funName}Value";
                if (FunDefs.ContainsKey(innerFunName))
                {
                    return;
                }


                var innerF = new FunDef(innerFunName, $"{innerFunName} : {Elm.Types.STRING} -> {Elm.Types.DECODER} {type.Name}");
                innerF.Params.Add("s");

                var caseExp = new CaseExp(new Id("s"));
                innerF.Body = caseExp;
                foreach (var alt in type.GetEnumNames())
                {
                    caseExp.Cases.Add(new Tuple <ElmAstNode, ElmAstNode>(
                                          new StringLiteral(alt),
                                          new FunApp(new Id("Decode.succeed"))
                    {
                        Rands = { new Id(AdtAlternativeName(type, alt)) }
                    }));
                }

                caseExp.Cases.Add(new Tuple <ElmAstNode, ElmAstNode>(
                                      new Id("_"),
                                      new FunApp(new Id("Decode.fail"))
                {
                    Rands = { new Id("(\"Unknown value: \" ++ s)") }
                }));

                FunDefs.Add(innerFunName, innerF);

                //Outer fun
                f.Body = new PipelineExpr()
                {
                    Exprs =
                    {
                        new Id(Elm.Decoders.STRING),
                        new FunApp(new Id(Elm.Decoders.ANDTHEN))
                        {
                            Rands = { new Id(innerFunName) }
                        }
                    }
                };
            }
            else
            {
                var pipeline = new PipelineExpr();
                pipeline.Exprs.Add(new FunApp(new Id("Decode.succeed"))
                {
                    Rands = { new Id(type.Name) }
                });
                foreach (var prop in type.GetProperties(PROP_FLAGS))
                {
                    var jsonAttrs = prop.GetCustomAttributes(typeof(JsonPropertyAttribute));
                    var jsonAttr  = jsonAttrs.FirstOrDefault() as JsonPropertyAttribute;
                    if (null != jsonAttr)
                    {
                        var jsonFieldName = jsonAttr.PropertyName ?? SnakeCase(prop.Name);
                        pipeline.Exprs.Add(new FunApp(new Id("required"))
                        {
                            Rands = { new StringLiteral(jsonFieldName), new Id(DecodeFunName(prop.PropertyType)) }
                        });
                    }
                }

                f.Body = pipeline;
            }

            FunDefs.Add(funName, f);
        }
Пример #14
0
        //<funDef>//
        public string Visit(FunDef node, int myint)
        {
            var currentFunc = Visit((dynamic)node[0], 1);
            var sb          = new StringBuilder();

            actualFun = currentFunc;
            if (currentFunc != "main")
            {
                amimain = "no";
                sb.Append("\t.method public static int32 '" + currentFunc + "' (");
            }
            else if (currentFunc == "main")
            {
                amimain = "yes";
                sb.Append("\t.method public static void 'start' (");
            }

            var functionAttr = functionsT[currentFunc];

            var functionContainer = functionAttr.refToFunc;
            var mypartFunct       = functionContainer.ParticularFunction;
            var mykeys            = mypartFunct.getkeys();
            IDictionary <int, string> paramposlist = new SortedDictionary <int, string>();

            foreach (var elitemo in mykeys)
            {
                var sb2  = new StringBuilder();
                var item = mypartFunct[elitemo];

                if (item.paramPos > -1)
                {
                    if (item.paramPos == 0)
                    {
                        sb2.Append(String.Format("int32 '{0}'", elitemo));
                    }
                    else
                    {
                        sb2.Append(String.Format(", int32 '{0}'", elitemo));
                    }
                }
                if (!paramposlist.ContainsKey(item.paramPos))
                {
                    paramposlist.Add(item.paramPos, sb2.ToString());
                }
            }

            foreach (var xOne in paramposlist)
            {
                sb.Append(xOne.Value);
            }

            sb.Append(")\n\t{\n");
            if (currentFunc == "main")
            {
                sb.Append("\t\t.entrypoint\n");
                sb.Append("\t\t.maxstack " + mymaxstackval * 5 + "\n");
            }
            else
            {
                sb.Append("\t\t.maxstack " + mymaxstackval * 5 + "\n");
            }

            foreach (var elitemo in mykeys)
            {
                var item = mypartFunct[elitemo];
                if (item.paramPos <= -1)
                {
                    sb.Append(String.Format(
                                  "\t\t.locals init ({0} '{1}')\n",
                                  myType,
                                  elitemo)
                              );
                }
            }
            sb.Append("\t\n" + Visit((dynamic)node[3]) + "\n");

            if (currentFunc == "main" || mycoolReturn != 1)
            {
                if (mycoolReturn != 1)
                {
                    sb.Append("\t\tldc.i4.0\n");
                }
                if (amimain.Equals("yes") && mycoolReturn != 1)
                {
                    sb.Append("\t\tcall void class ['mscorlib']'System'.'Environment'::'Exit'(int32)\n");
                }
                if (mycoolReturn != 1)
                {
                    sb.Append("\t\tret\n");
                }
            }
            sb.Append("\t}\n");
            mycoolReturn = 0;
            amimain      = "no";
            actualFun    = "";
            return(sb.ToString());
        }