package freeboogie.ast.gen; import java.util.HashMap; import java.util.Map; /** * Represents an abstract grammar (AG). It is basically a map from * class names to {@code AgClass} objects plus a couple of utility * methods. * * @author rgrig * @author reviewed by TODO */ public class Grammar { /** * A map from class names to {@code AgClass} objects. */ public Map<String, AgClass> classes; /** Creates a new grammar object. */ public Grammar() { classes = new HashMap<String, AgClass>(101); } /** * Return the class with the specified name, initializing an * {@code AgClass} object if necessary. * * @param name the class name * @return the {@code AgClass} object representing the class */ public AgClass getAgClass(String name) { AgClass cls = classes.get(name); if (cls == null) { cls = new AgClass(); classes.put(name, cls); cls.name = name; } return cls; } /** * We set here all things that are left behind by {@code AgParser}. * * A member is considered to be a primitive iff its type is not a * class name. * * A member is considered to have an enum type if an enum with the * type name exists. The user should be careful not to have name * conflicts between classes and enums. * * If a class does not have an explicit base class it is set * to |defaultBase|. * * @param defaultBaseName the default base class name */ public void makeConsistent(String defaultBaseName) { for (AgClass c : classes.values()) { if (c.base == null) c.base = defaultBaseName; for (AgMember m : c.members) { m.isenum = c.hasEnum(m.type); m.primitive = m.isenum || !classes.containsKey(m.type); } } } }