All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.devsmart.microdb.SemPass1 Maven / Gradle / Ivy

package com.devsmart.microdb;

import com.devsmart.microdb.ast.Nodes;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.TerminalNode;


public class SemPass1 extends MicroDBBaseVisitor {

    private final CompilerContext mContext;
    private Nodes.FileNode mCurrentFile;
    private Nodes.DBONode mCurrentDBO;

    public SemPass1(CompilerContext ctx) {
        mContext = ctx;
    }

    private void error(String msg, Token location) {
        mContext.error(msg, location);
    }

    private void warn(String msg, Token location) {
        mContext.warn(msg, location);
    }

    private Nodes.Node putMap(ParserRuleContext ctx, Nodes.Node node) {
        mContext.nodeMap.put(ctx, node);
        return node;
    }

    @Override
    public Nodes.Node visitDbo(MicroDBParser.DboContext ctx) {
        String name = ctx.name.getText();
        String extend = ctx.extend != null ? ctx.extend.getText() : null;

        mCurrentDBO = new Nodes.DBONode(name, extend);
        visit(ctx.exprlist());
        return mCurrentDBO;
    }

    @Override
    public Nodes.Node visitField(MicroDBParser.FieldContext ctx) {

        Nodes.TypeNode type = (Nodes.TypeNode) visit(ctx.type());
        String name = ctx.name.getText();
        if("id".equals(name)) {
            error("field with name 'id' is reserved", ctx.name);
        }

        Nodes.FieldNode fieldNode = new Nodes.FieldNode(type, name);
        mCurrentDBO.fields.add(fieldNode);

        return fieldNode;
    }

    @Override
    public Nodes.Node visitExprlist(MicroDBParser.ExprlistContext ctx) {
        TerminalNode codeblock = ctx.CODEBLOCK();
        if(codeblock != null) {
            String codeblockStr = codeblock.getText();
            codeblockStr = codeblockStr.substring(7);
            codeblockStr = codeblockStr.substring(0, codeblockStr.length()-7);
            mCurrentDBO.codeblocks.add(codeblockStr);
        }
        return super.visitExprlist(ctx);
    }

    @Override
    public Nodes.Node visitFile(MicroDBParser.FileContext ctx) {
        mCurrentFile = new Nodes.FileNode();
        visit(ctx.header());

        for(MicroDBParser.DboContext dbo : ctx.dbo()){
            mCurrentFile.dboList.add((Nodes.DBONode) visit(dbo));
        }
        return mCurrentFile;
    }

    @Override
    public Nodes.Node visitHeader(MicroDBParser.HeaderContext ctx) {
        super.visitHeader(ctx);
        MicroDBParser.PackageNameContext packagename = ctx.packageName();
        if(packagename != null) {
            mCurrentFile.packageName = packagename.getText();
        } else {
            warn("missing package name", ctx.start);
        }

        return null;
    }

    @Override
    public Nodes.Node visitType(MicroDBParser.TypeContext ctx) {
        Nodes.TypeNode retval = (Nodes.TypeNode) visit(ctx.type1());
        for(Token anno : ctx.anno){
            retval.annotations.add(anno.getText());
        }
        retval.isArray = ctx.ARRAYTYPE() != null;
        return retval;
    }

    @Override
    public Nodes.Node visitPrimitiveType(MicroDBParser.PrimitiveTypeContext ctx) {
        switch (ctx.t.getType()) {

            case MicroDBLexer.BOOL:
                return Nodes.createBool();

            case MicroDBLexer.BYTE:
                return Nodes.NumberType.createInt8();

            case MicroDBLexer.CHAR:
                return Nodes.createChar();

            case MicroDBLexer.SHORT:
                return Nodes.NumberType.createInt16();

            case MicroDBLexer.INT:
                return Nodes.NumberType.createInt32();

            case MicroDBLexer.LONG:
                return Nodes.NumberType.createInt64();

            case MicroDBLexer.FLOAT:
                return Nodes.NumberType.createFloat32();

            case MicroDBLexer.DOUBLE:
                return Nodes.NumberType.createFloat64();

            case MicroDBLexer.STRING:
                return Nodes.createString();
        }
        return null;
    }

    @Override
    public Nodes.Node visitObjType(MicroDBParser.ObjTypeContext ctx) {
        return putMap(ctx, new Nodes.ObjType(ctx.getText()));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy