xref: /aosp_15_r20/external/apache-commons-bcel/src/examples/Mini/ASTIdent.java (revision 0c56280ab0842982c46a149f7b9eaa497e31e292)
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