package parser.ServletParser.javapass2;

import parser.ServletParser.library.*;

/** 이 클래스는 두번째 패스의 파싱 시에 사용되는 파스 트리 노드 객체를 위한 것이다.
  */
public class ParseTreeNode2 extends Object {
	/** 현재 노드 포함하는 심볼의 내용
	 */
	public String value;
	/** 현재 심볼의 타입 정보
	 */
	public String type;
	/** 현재 심볼이 스트링 타입인 경우의 값
	 */
	public String strValue;
	/** 심볼 테이블 엔트리
	 */
	public VarRefItem entryPtr;
	/** 현재 non terminal symbol과 관련한 전체 스트링
	 */
	public String fullString;
	/** qualified name 인 경우의 나머지 이름들
	 */
	public StringList qList; 
	/** 자식 노드들에 대한 링크
	 */
	public ParseTreeNode2 children;
	/** 형제 노드들에 대한 링크
	 */
	public ParseTreeNode2 siblings;
	/** argument list 경우 다음 인자에 대한 링크
	 */
	public ParseTreeNode2 nextArg;
	/** 호출 명령과 관련한 정보
	 */
	public CallInfo callInfo;
	/** 생성된 클래스 이름
	 */
	public String createdClassName;
	/** 생성자이다.
	 */
	ParseTreeNode2() {
		value = new String("");
		strValue = new String("");
		entryPtr = null;
		fullString = new String("");
		qList = new StringList();
		type = new String("");
		children = null;
		siblings = null;
		nextArg = null;
		callInfo = null;
		createdClassName = new String("");
	}
	/** 생성자이다.
	 */
	ParseTreeNode2(String v) {
		if (v == null) {
			value = new String("");
		} else {
			value = v;
		}
		strValue = new String("");
		entryPtr = null;
		fullString = new String(value);
		qList = new StringList();
		type = new String("");
		children = null;
		siblings = null;
		nextArg = null;
		callInfo = null;
		createdClassName = new String("");
	}
	/** 형제 노드의 수를 세는 함수이다.
	 */
	public int getSiblingCount() {
		int count = 1;
		ParseTreeNode2 aNode = this.siblings;
		while (aNode != null) {
			count++;
			aNode = aNode.siblings;
		}
		return count;
	}
	/** value 필드에 대한 access 함수
	 */
	void setValue(String v) {
		value = v;
	}
	/** strValue 필드에 대한 access 함수
	 */
	void setStrValue(String v) {
		strValue = v;
	}
	/** type 필드에 대한 access 함수
	 */
	void setType(String t) {
		type = t;
	}
	/** children 필드에 대한 access 함수
	 */
	void setChild(ParseTreeNode2 child) {
		children = child;
	}
	/** siblings 필드에 대한 access 함수
	 */
	void setSibling(ParseTreeNode2 sibling) {
		siblings = sibling;
	}
	/** 현재 노드를 클래스 이름으로 해석할 때 클래스 이름을 반환하는 함수이다.
	 */
	public String toStringAsClassName() {
		String aLine = new String("");
		aLine = aLine + value;
		return aLine;
	}
	/** 현재 노드를 데이타 멤버로 해석할 때 UML 양식으로 문자열을 만드는 함수이다.
	 */
	public String toStringAsDataMember() {
		String aLine = new String("");
		ParseTreeNode2 nameNode = this;
		ParseTreeNode2 typeNode = nameNode.siblings;
		ParseTreeNode2 defaultValueNode = typeNode.siblings;
		ParseTreeNode2 modifierNode = defaultValueNode.siblings;
		String modifierValue = new String("");
		if (modifierNode.value != null && modifierNode.value.length() > 1) {
			char vis = modifierNode.value.charAt(0);
			if (vis == '+') {
				aLine = aLine + "+";
				modifierValue = modifierNode.value.substring(1);
			} else if (vis == '#') {
				aLine = aLine + "#";
				modifierValue = modifierNode.value.substring(1);
			} else if (vis == '-') {
				aLine = aLine + "-";
				modifierValue = modifierNode.value.substring(1);
			}
		}
		aLine = aLine + this.value;
		if (typeNode.value != null && typeNode.value.length() > 0) {
			aLine = aLine + ":" + typeNode.value;
		}
		if (defaultValueNode.value != null && defaultValueNode.value.length() > 0) {
			aLine = aLine + "=" + defaultValueNode.value;
		}
		while (modifierValue.length() > 0 && modifierValue.charAt(0) == ' ') modifierValue = modifierValue.substring(1);
		if (modifierValue.length() > 0) {
			aLine = aLine + "{" + modifierValue + "}";
		}
		return aLine;
	}
	/** 현재 노드를 멤버 함수로 해석할 때 UML 양식으로 문자열을 만드는 함수이다.
	 */
	public String toStringAsMemberFunction() {
		String aLine = new String("");
		ParseTreeNode2 nameNode = this;
		ParseTreeNode2 typeNode = nameNode.siblings;
		ParseTreeNode2 modifierNode = typeNode.siblings;
		String modifierValue = new String("");
		if (modifierNode.value != null && modifierNode.value.length() > 1) {
			char vis = modifierNode.value.charAt(0);
			if (vis == '+') {
				aLine = aLine + "+";
				modifierValue = modifierNode.value.substring(1);
			} else if (vis == '#') {
				aLine = aLine + "#";
				modifierValue = modifierNode.value.substring(1);
			} else if (vis == '-') {
				aLine = aLine + "-";
				modifierValue = modifierNode.value.substring(1);
			}
		}
		aLine = aLine + this.value;
		String paraString = new String("");
		ParseTreeNode2 paraNode = this.children;
		while (paraNode != null) {
			paraString = paraString + paraNode.value + ":" + paraNode.siblings.value;
			paraNode = paraNode.children;
			if (paraNode != null) {
				paraString = paraString + ",";
			}
		}
		aLine = aLine + "(" + paraString + ")";
		if (typeNode.value != null && typeNode.value.length() > 0) {
			aLine = aLine + ":" + typeNode.value;
		}
		while (modifierValue.length() > 0 && modifierValue.charAt(0) == ' ') modifierValue = modifierValue.substring(1);
		if (modifierValue.length() > 0) {
			aLine = aLine + "{" + modifierValue + "}";
		}
		return aLine;
	}
};