Esempio n. 1
0
        void parseEnum()
        {
            Token identifier = parseData.tokens[parseData.cursor + 1];

            if (identifier.type != TT.IDENTIFIER)
            {
                throw Jolly.unexpected(identifier);
            }
            Token brace = parseData.tokens[parseData.cursor + 2];

            if (brace.type != TT.BRACE_OPEN)
            {
                throw Jolly.unexpected(brace);
            }
            parseData.cursor += 3;

            AST_Struct    enumNode  = new AST_Struct(token.location);             // Use struct node for now
            DataType_Enum enumType  = new DataType_Enum();
            SymbolTable   enumTable = new SymbolTable(scope);

            // enumNode.inherits = inherits;
            enumNode.nodeType = NT.ENUM;
            enumNode.symbol   = enumTable;
            enumNode.text     = enumType.name = identifier.text;
            enumNode.result   = enumTable.declaration = new IR {
                irType = NT.ENUM, dType = enumType, dKind = ValueKind.STATIC_TYPE
            };

            scope.addChild(identifier.text, enumTable);

            parseData.ast.Add(enumNode);

            int startNodeCount = parseData.ast.Count;
            var parser         = new ExpressionParser(parseData, TT.BRACE_CLOSE, enumTable, DefineMode.EXPRESSION, brace.partnerIndex)
                                 .parse(false);

            AST_Node[] memberNodes = (parser.getValue() as AST_Tuple)?.values.ToArray() ?? new AST_Node[] { parser.getValue() };
            enumNode.memberCount = parseData.ast.Count - startNodeCount;

            int nextValue = 0;

            foreach (var memberNode in memberNodes)
            {
                if (memberNode.nodeType != NT.NAME)
                {
                    throw Jolly.unexpected(memberNode);
                }

                var symbol = new Symbol(enumTable)
                {
                    declaration = new IR_Literal {
                        dType = enumType, data = nextValue++
                    }
                };
                enumTable.addChild(((AST_Symbol)memberNode).text, symbol);
            }
        }
Esempio n. 2
0
        void parseStruct()
        {
            Token name = parseData.tokens[parseData.cursor += 1];

            if (name.type != TT.IDENTIFIER)
            {
                throw Jolly.unexpected(token);
            }

            Token next = parseData.tokens[parseData.cursor += 1];

            AST_Struct      structNode  = new AST_Struct(token.location);
            DataType_Struct structType  = new DataType_Struct();
            SymbolTable     structTable = new SymbolTable(scope);

            structNode.index = parseData.ast.Count;
            parseData.ast.Add(structNode);
            int startNodeCount = parseData.ast.Count;

            if (next.type == TT.LESS)
            {
                parseData.cursor += 1;
                new ExpressionParser(parseData, TT.GREATER, structTable, DefineMode.TEMPLATE, end)
                .parse(false);
                next = parseData.tokens[parseData.cursor += 1];                 // Skip greater than
            }

            if (next.type == TT.COLON)
            {
                parseData.cursor   += 1;
                structNode.inherits =
                    new ExpressionParser(parseData, TT.BRACE_OPEN, structTable, DefineMode.EXPRESSION, end)
                    .parse(false)
                    .getValue();
                next = parseData.tokens[parseData.cursor];
            }

            if (next.type != TT.BRACE_OPEN)
            {
                throw Jolly.unexpected(next);
            }

            structNode.symbol = structTable;
            structNode.text   = structType.name = name.text;
            structNode.result = structTable.declaration = new IR {
                irType = NT.STRUCT, dType = structType, dKind = ValueKind.STATIC_TYPE
            };

            scope.addChild(name.text, structTable);

            parseData.cursor += 1;
            new ScopeParser(parseData, next.partnerIndex, structTable)
            .parse(ScopeParseMethod.STRUCT);

            structNode.memberCount = parseData.ast.Count - startNodeCount;
            structType.members     = new DataType[structType.memberMap.Count];
        }