From f839315682dc6103f751d3db9c6cb6c09cb4145a Mon Sep 17 00:00:00 2001 From: Recolic Keghart <root@recolic.net> Date: Fri, 5 Apr 2019 00:21:50 -0700 Subject: [PATCH] adding more expr --- .gitignore | 2 +- .../common/analysis/types/ClassValueType.java | 6 ++++ .../chocopy/common/astnodes/ClassDef.java | 5 ++++ .../java/chocopy/pa2/DeclarationAnalyzer.java | 29 +++++++++++++++++-- src/main/java/chocopy/pa2/TypeChecker.java | 20 ++++++++++--- 5 files changed, 54 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 6fb050f..2454cbe 100644 --- a/.gitignore +++ b/.gitignore @@ -150,4 +150,4 @@ Session.vim ### recolic *.gi - +*.log diff --git a/src/main/java/chocopy/common/analysis/types/ClassValueType.java b/src/main/java/chocopy/common/analysis/types/ClassValueType.java index 6e91683..c845503 100644 --- a/src/main/java/chocopy/common/analysis/types/ClassValueType.java +++ b/src/main/java/chocopy/common/analysis/types/ClassValueType.java @@ -1,9 +1,11 @@ package chocopy.common.analysis.types; +import java.util.Map; import java.util.Objects; import chocopy.common.astnodes.ClassType; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; /** Represents the semantic value of a simple class reference. */ @@ -12,6 +14,10 @@ public class ClassValueType extends ValueType { /** The name of the class. */ private final String className; + // recolic; + @JsonIgnore + public Map<String, SymbolType> memberMap = null; + /** A class type for the class named CLASSNAME. */ @JsonCreator public ClassValueType(@JsonProperty String className) { diff --git a/src/main/java/chocopy/common/astnodes/ClassDef.java b/src/main/java/chocopy/common/astnodes/ClassDef.java index dad7e2a..1688482 100644 --- a/src/main/java/chocopy/common/astnodes/ClassDef.java +++ b/src/main/java/chocopy/common/astnodes/ClassDef.java @@ -1,8 +1,10 @@ package chocopy.common.astnodes; +import java.util.Map; import java.util.List; import chocopy.common.analysis.NodeAnalyzer; +import chocopy.common.analysis.types.SymbolType; import java_cup.runtime.ComplexSymbolFactory.Location; /** A class definition. */ @@ -15,6 +17,9 @@ public class ClassDef extends Declaration { /** Body of the class. */ public final List<Declaration> declarations; + // Recolic: + public Map<String, SymbolType> memberMap = null; + /** An AST for class * NAME(SUPERCLASS): * DECLARATIONS. diff --git a/src/main/java/chocopy/pa2/DeclarationAnalyzer.java b/src/main/java/chocopy/pa2/DeclarationAnalyzer.java index 12c534b..09ab320 100644 --- a/src/main/java/chocopy/pa2/DeclarationAnalyzer.java +++ b/src/main/java/chocopy/pa2/DeclarationAnalyzer.java @@ -8,6 +8,10 @@ import chocopy.common.analysis.types.SymbolType; import chocopy.common.analysis.types.ValueType; import chocopy.common.astnodes.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + /** * Analyzes declarations to create a top-level symbol table. * Recolic: This class will ONLY fill the symTable. Every `Program` and `FuncDef` has a sym table. @@ -60,7 +64,22 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer<SymbolType> { @Override public SymbolType analyze(ClassDef classDef) { - System.out.println("debug: classdef"); + assert classDef.memberMap == null; + classDef.memberMap = new HashMap<>(); + assert classDef.memberMap != null; + + ClassValueType result_type = new ClassValueType(classDef.name.name); + SymbolTable<SymbolType> symLayer = new SymbolTable<>(sym); + symLayer.put("self", result_type); + sym = symLayer; + + for(Declaration decl : classDef.declarations) { + String name = decl.getIdentifier().name; + SymbolType type = decl.dispatch(this); + classDef.memberMap.put(name, type); + } + + sym = sym.getParent(); return new ClassValueType(classDef.name.name); } @@ -72,9 +91,12 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer<SymbolType> { assert funcDef.symTable != null; // may suck if partial-compiling happens... // Func parameter list + List<ValueType> args = new ArrayList<>(); for(TypedVar param : funcDef.params) { String name = param.identifier.name; - sym.put(name, analyze(param)); + ValueType type = ValueType.annotationToValueType(param.type); + sym.put(name, type); + args.add(type); } for(Declaration decl : funcDef.declarations) { @@ -87,7 +109,8 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer<SymbolType> { sym = sym.getParent(); if(sym == null) throw new RuntimeException("logic error: sym parent is null while returning.."); - return new FuncType(ValueType.annotationToValueType(funcDef.returnType)); + FuncType funcT = new FuncType(args, ValueType.annotationToValueType(funcDef.returnType)); + return funcT; } @Override diff --git a/src/main/java/chocopy/pa2/TypeChecker.java b/src/main/java/chocopy/pa2/TypeChecker.java index 5b4e490..08faeb7 100644 --- a/src/main/java/chocopy/pa2/TypeChecker.java +++ b/src/main/java/chocopy/pa2/TypeChecker.java @@ -2,10 +2,7 @@ package chocopy.pa2; import chocopy.common.analysis.AbstractNodeAnalyzer; import chocopy.common.analysis.SymbolTable; -import chocopy.common.analysis.types.FuncType; -import chocopy.common.analysis.types.ListValueType; -import chocopy.common.analysis.types.SymbolType; -import chocopy.common.analysis.types.ValueType; +import chocopy.common.analysis.types.*; import chocopy.common.astnodes.*; import java.util.*; @@ -247,6 +244,21 @@ public class TypeChecker extends AbstractNodeAnalyzer<SymbolType> { } } + @Override + public SymbolType analyze(MemberExpr node) { + ClassValueType objType = (ClassValueType) node.object.dispatch(this); + if(objType == null) { + err(node, ". operator left operand is not object type."); + return NONE_TYPE; + } + SymbolType resultType = objType.memberMap.get(node.member.name); // currently won't work. classDef not analyzed. + if(resultType == null) { + err(node, "undefined identifier " + node.member.name + " as object member."); + return NONE_TYPE; + } + return resultType; + } + @Override public SymbolType analyze(Identifier id) { String varName = id.name; -- GitLab