1:entity ::= 2: #ignore(JAVA) 3: [entityDeclaration]* 4: #empty 5: => { 6: traceLine("\nPARSE COMPLETE AND VALID\n"); 7: } 8:; 9: 10: 11:entityDeclaration ::= 12: IDENT: "entity" 13: IDENT: eName 14: => { 15: insert project.entities[eName].name = eName; 16: } 17: entityBody(project.entities[eName]); 18: 19: 20:entityBody(entity : node) ::= 21: '(' 22: [field(entity) | list(entity) | parent(entity)]* 23: ')' 24:; 25: 26: 27:field(entity : node) ::= 28: IDENT: "field" ':' 29: IDENT: fName 30: => local field; 31: => { 32: insert entity.fields[fName].name = fName; 33: ref field = entity.fields[fName]; 34: } 35: [integer(field) | string(field)]+ 36:; 37: 38:integer(field : node) ::= 39: IDENT: "int" 40: => { 41: insert field.type.name = "int"; 42: } 43:; 44: 45:string(field : node) ::= 46: IDENT: "string" 47: NUM: length 48: => { 49: insert field.type.name = "String"; 50: insert field.type.length = length; 51: } 52:; 53: 54: 55:list(entity : node) ::= 56: IDENT: "list" ':' 57: IDENT: role 58: => { 59: insert entity.lists[role].role = role; 60: } 61: IDENT: relatedTo 62: => { 63: insert entity.lists[role].relatedType = relatedTo; 64: } 65:; 66: 67: 68:parent(entity : node) ::= 69: IDENT: "parent" ':' 70: IDENT: role 71: => { 72: insert entity.parents[role].role = role; 73: } 74: IDENT: relatedTo 75: => { 76: insert entity.parents[role].relatedType = relatedTo; 77: } 78:; 79: 80: 81:IDENT ::= #!ignore ['a'..'z'|'A'..'Z'] ['a'..'z'|'A'..'Z'|'0'..'9']*; 82: 83:NUM ::= #!ignore ['0'..'9']+;