public void Visit(ListLiteralNode node) { builder.AppendLine($"\t\tldc.i4 {node.Count()}"); string listType = ""; string elementType = ""; if (node[0] is IntLiteralNode) { listType = "int32"; elementType = "i4"; } else if (node[0] is BoolLiteralNode) { listType = "bool"; elementType = "i4"; } else if (node[0] is StringLiteralNode) { listType = "string"; elementType = "ref"; } builder.AppendLine($"\t\tnewarr {listType}"); int index = 0; foreach (var n in node) { builder.AppendLine("\t\tdup"); builder.AppendLine($"\t\tldc.i4 {index}"); Visit((dynamic)n); builder.AppendLine($"\t\tstelem.{elementType}"); index++; } }
public Type Visit(ListLiteralNode node) { if (node.Count() == 0) { return(Type.LIST); } Type first = Visit((dynamic)node[0]); foreach (var n in node) { Type t = Visit((dynamic)n); if (t != first) { throw new SemanticError("All elements of a list should be the same tipe, " + $"expected {first} but got {t}", n.AnchorToken); } } return(first.ToListType()); }