001 /*
002 @license.text@
003 */
004 package com.hammurapi.bnf2emf;
005
006 import antlr.collections.AST;
007
008 /**
009 * Parses attribute definition.
010 *
011 * @author Pavel Vlasov
012 * @revision $Revision$
013 */
014 public class Attribute {
015
016 public enum AttributeType { ATTRIBUTE, REFERENCE }
017
018 private boolean isList;
019 private AttributeType attributeType;
020 private boolean isReference;
021 private String name;
022 private String type;
023 private Attribute opposite;
024
025 public Attribute(AST node) {
026 for (AST child=node.getFirstChild(); child!=null; child=child.getNextSibling()) {
027 switch (child.getType()) {
028 case BnfTokenTypes.LITERAL_attribute:
029 attributeType = AttributeType.ATTRIBUTE;
030 break;
031 case BnfTokenTypes.LITERAL_reference:
032 attributeType = AttributeType.REFERENCE;
033 break;
034 case BnfTokenTypes.LITERAL_opposite:
035 opposite = new Attribute(child);
036 break;
037 case BnfTokenTypes.LITERAL_list:
038 isList=true;
039 break;
040 case BnfTokenTypes.IDENT:
041 case BnfTokenTypes.DOT:
042 StringBuffer nameBuf=new StringBuffer();
043 typeName(child, nameBuf);
044 if (name==null) {
045 name=nameBuf.toString();
046 type=name;
047 } else {
048 type=nameBuf.toString();
049 }
050 break;
051 default:
052 throw new IllegalArgumentException("Unexpected node type: "+BnfRecognizer._tokenNames[child.getType()]);
053 }
054 }
055 }
056
057 static void typeName(AST node, StringBuffer sb) {
058 if (node.getType()==BnfTokenTypes.DOT) {
059 typeName(node.getFirstChild(), sb);
060 sb.append(".");
061 typeName(node.getFirstChild().getNextSibling(), sb);
062 } else {
063 sb.append(node.getText());
064 }
065 }
066
067 public String getName() {
068 return name;
069 }
070
071 public boolean isList() {
072 return isList;
073 }
074
075 public AttributeType getAttributeType() {
076 return attributeType;
077 }
078
079 public String getType() {
080 return type;
081 }
082
083 public boolean isReference() {
084 return isReference;
085 }
086
087 public Attribute getOpposite() {
088 return opposite;
089 }
090 }