package x2x.translator.xcodeml.xelement;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * The XexprModel represents the exprModel (9.4) element in XcodeML
 * intermediate representation.
 *
 * Elements:
 * - Required: on of the followings elements:
 *   - FintConstant (XintConstant), FrealConstant (XrealConstant),
 *     FcomplexConstant TODO, FcharacterConstant (TODO), FlogicalConstant TODO
 *   - FarrayConstructor, FstructConstructor
 *   - Var (Xvar)
 *   - FarrayRef, FcharacterRef, FmemberRef, FcoArrayRef, varRef
 *   - functionCall
 *   - plusExpr, minusExpr, mulExpr, divExpr, FpowerExpr, FconcatExpr
 *   - logEQExpr, logNEQExpr, logGEExpr, logGTExpr, logLEExpr, logLTExpr,
 *     logAndExpr, logOrExpr, logEQVExpr, logNEQVExpr, logNotExpr
 *   - unaryMinusExpr, userBinaryExpr, userUnaryExpr
 *   - FdoLoop
 */

public class XexprModel {
  private XbaseElement _element = null;

  public XexprModel(XbaseElement element){
    _element = element;
  }

  public XbaseElement getElement(){
    return _element;
  }

  public void setElement(XbaseElement element){
    _element = element;
  }

  public boolean isVar(){
    if(_element != null && _element instanceof Xvar){
      return true;
    }
    return false;
  }

  public Xvar getVar(){
    if(isVar()){
      return (Xvar)_element;
    }
    return null;
  }

  public boolean isIntConst(){
    if(_element != null && _element instanceof XintConstant){
      return true;
    }
    return false;
  }

  public XintConstant getIntConstant(){
    if(isIntConst()){
      return (XintConstant)_element;
    }
    return null;
  }


}

@@ -375,20 +375,34 @@
 onstant 
-TODO
+(XcomplexConstant)
 , Fchara
@@ -417,14 +417,35 @@
 tant
- (TODO
+%0A *     (XcharacterConstant
 ), F
@@ -464,12 +464,26 @@
 ant 
-TODO
+(XlogicalConstant)
 %0A * 
@@ -503,16 +503,21 @@
 structor
+ TODO
 , Fstruc
@@ -528,16 +528,21 @@
 structor
+ TODO
 %0A *   - 
@@ -568,16 +568,28 @@
 arrayRef
+ (XarrayRef)
 , Fchara
@@ -595,16 +595,21 @@
 acterRef
+ TODO
 , Fmembe
@@ -612,17 +612,29 @@
 emberRef
-,
+ TODO,%0A *    
  FcoArra
@@ -641,16 +641,21 @@
 yRef
+ TODO
 , varRef
 %0A * 
@@ -650,16 +650,26 @@
 , varRef
+ (XvarRef)
 %0A *   - 
@@ -680,16 +680,27 @@
 tionCall
+ (XfctCall)
 %0A *   - 
@@ -897,24 +897,33 @@
 , logNotExpr
+ TODO ALL
 %0A *   - unar
@@ -959,24 +959,29 @@
 serUnaryExpr
+ TODO
 %0A *   - FdoL
@@ -983,16 +983,22 @@
  FdoLoop
+ (Xdo)
 %0A */%0A%0Apu
@@ -1538,234 +1538,650 @@
     
-if(_element != null && _element instanceof XintConstant)%7B%0A      return true;%0A    %7D%0A    return false;%0A  %7D%0A%0A  public XintConstant getIntConstant()%7B%0A    if(isIntConst())%7B%0A      return (XintConstant)_element;%0A    %7D%0A    return null
+return isOfType(XintConstant.class);%0A  %7D%0A%0A  public boolean isRealConst()%7B%0A    return isOfType(XrealConstant.class);%0A  %7D%0A%0A  public boolean isCharConst()%7B%0A    return isOfType(XcharacterConstant.class);%0A  %7D%0A%0A  public boolean isLogicalConst()%7B%0A    return isOfType(XlogicalConstant.class);%0A  %7D%0A%0A  public boolean isComplexConst()%7B%0A    return isOfType(XcomplexConstant.class);%0A  %7D%0A%0A  public XintConstant getIntConstant()%7B%0A    if(isIntConst())%7B%0A      return (XintConstant)_element;%0A    %7D%0A    return null;%0A  %7D%0A%0A  %0A%0A  private boolean isOfType(Class type)%7B%0A    if(_element != null && type.isInstance(_element))%7B%0A      return true;%0A    %7D%0A    return false
 ;%0A  

Add some features to exprModel