1*0c56280aSSorin Basca /* 2*0c56280aSSorin Basca * Licensed to the Apache Software Foundation (ASF) under one or more 3*0c56280aSSorin Basca * contributor license agreements. See the NOTICE file distributed with 4*0c56280aSSorin Basca * this work for additional information regarding copyright ownership. 5*0c56280aSSorin Basca * The ASF licenses this file to You under the Apache License, Version 2.0 6*0c56280aSSorin Basca * (the "License"); you may not use this file except in compliance with 7*0c56280aSSorin Basca * the License. You may obtain a copy of the License at 8*0c56280aSSorin Basca * 9*0c56280aSSorin Basca * http://www.apache.org/licenses/LICENSE-2.0 10*0c56280aSSorin Basca * 11*0c56280aSSorin Basca * Unless required by applicable law or agreed to in writing, software 12*0c56280aSSorin Basca * distributed under the License is distributed on an "AS IS" BASIS, 13*0c56280aSSorin Basca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*0c56280aSSorin Basca * See the License for the specific language governing permissions and 15*0c56280aSSorin Basca * limitations under the License. 16*0c56280aSSorin Basca * 17*0c56280aSSorin Basca */ 18*0c56280aSSorin Basca /* Generated By:JJTree: Do not edit this line. ASTIdent.java */ 19*0c56280aSSorin Basca /* JJT: 0.3pre1 */ 20*0c56280aSSorin Basca 21*0c56280aSSorin Basca package Mini; 22*0c56280aSSorin Basca import org.apache.bcel.generic.ConstantPoolGen; 23*0c56280aSSorin Basca import org.apache.bcel.generic.ILOAD; 24*0c56280aSSorin Basca import org.apache.bcel.generic.InstructionList; 25*0c56280aSSorin Basca import org.apache.bcel.generic.LocalVariableGen; 26*0c56280aSSorin Basca import org.apache.bcel.generic.MethodGen; 27*0c56280aSSorin Basca import org.apache.bcel.generic.PUSH; 28*0c56280aSSorin Basca 29*0c56280aSSorin Basca /** 30*0c56280aSSorin Basca * 31*0c56280aSSorin Basca * @version $Id$ 32*0c56280aSSorin Basca */ 33*0c56280aSSorin Basca public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { 34*0c56280aSSorin Basca private String name; 35*0c56280aSSorin Basca private Variable reference; // Reference in environment to decl of this ident 36*0c56280aSSorin Basca 37*0c56280aSSorin Basca // Generated methods ASTIdent(int id)38*0c56280aSSorin Basca ASTIdent(int id) { 39*0c56280aSSorin Basca super(id); 40*0c56280aSSorin Basca } 41*0c56280aSSorin Basca ASTIdent(MiniParser p, int id)42*0c56280aSSorin Basca ASTIdent(MiniParser p, int id) { 43*0c56280aSSorin Basca super(p, id); 44*0c56280aSSorin Basca } 45*0c56280aSSorin Basca jjtCreate(MiniParser p, int id)46*0c56280aSSorin Basca public static Node jjtCreate(MiniParser p, int id) { 47*0c56280aSSorin Basca return new ASTIdent(p, id); 48*0c56280aSSorin Basca } 49*0c56280aSSorin Basca ASTIdent(String name, int type, int line, int column)50*0c56280aSSorin Basca public ASTIdent(String name, int type, int line, int column) { 51*0c56280aSSorin Basca super(line, column, JJTIDENT); 52*0c56280aSSorin Basca 53*0c56280aSSorin Basca this.name = name; 54*0c56280aSSorin Basca this.type = type; 55*0c56280aSSorin Basca } 56*0c56280aSSorin Basca 57*0c56280aSSorin Basca // closeNode, dump inherited 58*0c56280aSSorin Basca 59*0c56280aSSorin Basca /** 60*0c56280aSSorin Basca * @return identifier and line/column number of appearance 61*0c56280aSSorin Basca */ 62*0c56280aSSorin Basca @Override toString()63*0c56280aSSorin Basca public String toString() { 64*0c56280aSSorin Basca return super.toString() + " = " + name; 65*0c56280aSSorin Basca } 66*0c56280aSSorin Basca 67*0c56280aSSorin Basca /** 68*0c56280aSSorin Basca * Overrides ASTExpr.traverse() 69*0c56280aSSorin Basca */ 70*0c56280aSSorin Basca @Override traverse(Environment env)71*0c56280aSSorin Basca public ASTExpr traverse(Environment env) { 72*0c56280aSSorin Basca EnvEntry entry = env.get(name); 73*0c56280aSSorin Basca 74*0c56280aSSorin Basca if(entry == null) { 75*0c56280aSSorin Basca MiniC.addError(line, column, "Undeclared identifier " + name); 76*0c56280aSSorin Basca } else if(entry instanceof Function) { 77*0c56280aSSorin Basca MiniC.addError(line, column, 78*0c56280aSSorin Basca "Function " + name + " used as an identifier."); 79*0c56280aSSorin Basca } else { 80*0c56280aSSorin Basca reference = (Variable)entry; 81*0c56280aSSorin Basca } 82*0c56280aSSorin Basca 83*0c56280aSSorin Basca return this; // Nothing to reduce/traverse further here 84*0c56280aSSorin Basca } 85*0c56280aSSorin Basca 86*0c56280aSSorin Basca /** 87*0c56280aSSorin Basca * Overrides AstExpr.eval() 88*0c56280aSSorin Basca */ 89*0c56280aSSorin Basca @Override eval(int expected)90*0c56280aSSorin Basca public int eval(int expected) { 91*0c56280aSSorin Basca ASTIdent ident = reference.getName(); 92*0c56280aSSorin Basca int t = ident.getType(); 93*0c56280aSSorin Basca 94*0c56280aSSorin Basca is_simple = true; // (Very) simple expression, always true 95*0c56280aSSorin Basca 96*0c56280aSSorin Basca if((t == T_UNKNOWN) && (expected == T_UNKNOWN)) { 97*0c56280aSSorin Basca type = T_UNKNOWN; 98*0c56280aSSorin Basca } else if((t == T_UNKNOWN) && (expected != T_UNKNOWN)) { 99*0c56280aSSorin Basca ident.setType(expected); 100*0c56280aSSorin Basca type = expected; 101*0c56280aSSorin Basca } 102*0c56280aSSorin Basca else if((t != T_UNKNOWN) && (expected == T_UNKNOWN)) { 103*0c56280aSSorin Basca ident.setType(t); 104*0c56280aSSorin Basca type = t; 105*0c56280aSSorin Basca } else { 106*0c56280aSSorin Basca type = t; // Caller has to check for an error, i.e. t != expected 107*0c56280aSSorin Basca } 108*0c56280aSSorin Basca 109*0c56280aSSorin Basca return type; 110*0c56280aSSorin Basca } 111*0c56280aSSorin Basca 112*0c56280aSSorin Basca /** 113*0c56280aSSorin Basca * Fourth pass, produce Java code. 114*0c56280aSSorin Basca */ 115*0c56280aSSorin Basca @Override code(StringBuffer buf)116*0c56280aSSorin Basca public void code(StringBuffer buf) { 117*0c56280aSSorin Basca if(name.equals("TRUE")) { 118*0c56280aSSorin Basca ASTFunDecl.push(buf, "1"); 119*0c56280aSSorin Basca } else if(name.equals("FALSE")) { 120*0c56280aSSorin Basca ASTFunDecl.push(buf, "0"); 121*0c56280aSSorin Basca } else { 122*0c56280aSSorin Basca ASTFunDecl.push(buf, name); 123*0c56280aSSorin Basca } 124*0c56280aSSorin Basca } 125*0c56280aSSorin Basca 126*0c56280aSSorin Basca /** 127*0c56280aSSorin Basca * Fifth pass, produce Java byte code. 128*0c56280aSSorin Basca */ 129*0c56280aSSorin Basca @Override byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp)130*0c56280aSSorin Basca public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { 131*0c56280aSSorin Basca if(name.equals("TRUE")) { 132*0c56280aSSorin Basca il.append(new PUSH(cp, 1)); 133*0c56280aSSorin Basca } else if(name.equals("FALSE")) { 134*0c56280aSSorin Basca il.append(new PUSH(cp, 0)); 135*0c56280aSSorin Basca } else { 136*0c56280aSSorin Basca LocalVariableGen local_var = reference.getLocalVariable(); 137*0c56280aSSorin Basca il.append(new ILOAD(local_var.getIndex())); 138*0c56280aSSorin Basca } 139*0c56280aSSorin Basca ASTFunDecl.push(); 140*0c56280aSSorin Basca } 141*0c56280aSSorin Basca 142*0c56280aSSorin Basca setName(String name)143*0c56280aSSorin Basca public void setName(String name) { this.name = name; } getName()144*0c56280aSSorin Basca public String getName() { return name; } 145*0c56280aSSorin Basca } 146