Commit 0fbf8618 authored by Niklas Fors's avatar Niklas Fors
Browse files

Add code generation for abstract grammar and fix bug

parent b63622ab
......@@ -18,7 +18,17 @@ aspect TypeAnalysis {
}
aspect ComponentAnalysis {
syn boolean Component.isDeclaringName() = true;
eq RelationComponent.isDeclaringName() = !isTargetOfRightDirection();
inh boolean RelationComponent.isTargetOfRightDirection();
eq Relation.getRight().isTargetOfRightDirection()
= getDirection() instanceof RightDirection;
eq Program.getChild().isTargetOfRightDirection() = false;
syn String Component.name() {
if (!isDeclaringName()) {
return "";
}
if (!getID().isEmpty()) {
return getID();
}
......@@ -32,14 +42,18 @@ aspect ComponentAnalysis {
eq Program.getChild().otherRelationSideName()
= "";
syn TypeDecl Component.typeDecl() = enclosingTypeDecl();
eq RelationComponent.typeDecl() = getTypeUse().decl();
syn TypeDecl Component.toTypeDecl() = enclosingTypeDecl();
eq RelationComponent.toTypeDecl() = getTypeUse().decl();
inh TypeDecl Component.enclosingTypeDecl();
eq TypeDecl.getChild().enclosingTypeDecl() = this;
eq Program.getChild().enclosingTypeDecl() = null;
inh TypeDecl RelationComponent.ofTypeDecl();
eq Relation.getLeft().ofTypeDecl() = getRight().toTypeDecl();
eq Relation.getRight().ofTypeDecl() = getLeft().toTypeDecl();
eq Program.getChild().ofTypeDecl() = null;
syn boolean Component.isAlreadyDeclared()
= lookupComponent(typeDecl(), name()) != this;
= isDeclaringName() && lookupComponent(toTypeDecl(), name()) != this;
inh Component Component.lookupComponent(TypeDecl td, String name);
eq Program.getChild().lookupComponent(TypeDecl td, String name) {
if (td != null) {
......@@ -50,15 +64,27 @@ aspect ComponentAnalysis {
}
}
for (Relation r: getRelations()) {
if (r.getLeft().typeDecl() == td && r.getLeft().name().equals(name)) {
return r.getLeft();
}
if (r.getRight().typeDecl() == td && r.getRight().name().equals(name)) {
return r.getRight();
}
Component c = r.getLeft().lookup(td, name);
if (c != null) return c;
c = r.getRight().lookup(td, name);
if (c != null) return c;
}
return null;
}
syn RelationComponent RelationComponent.lookup(TypeDecl td, String name)
= isDeclaringName() && toTypeDecl() == td && name().equals(name)
? this
: null;
coll Set<RelationComponent> TypeDecl.relationComponents()
[new HashSet<RelationComponent>()]
root Program;
RelationComponent contributes this
when isDeclaringName() && toTypeDecl() != null
to TypeDecl.relationComponents()
for toTypeDecl();
}
aspect Utils {
......
aspect BackendAbstractGrammar {
public String Program.generateAbstractGrammar() {
StringBuilder sb = new StringBuilder();
generateAbstractGrammar(sb);
return sb.toString();
}
public void Program.generateAbstractGrammar(StringBuilder sb) {
for (TypeDecl td: getTypeDecls()) {
td.generateAbstractGrammar(sb);
}
}
public void TypeDecl.generateAbstractGrammar(StringBuilder sb) {
if (getAbstract()) {
sb.append("abstract ");
}
sb.append(getID());
if (hasSuper()) {
sb.append(" : " + getSuper());
}
if (getNumComponent() > 0 || relationComponents().size() > 0) {
sb.append(" ::=");
}
for (Component c: getComponents()) {
sb.append(" ");
sb.append(c.generateAbstractGrammar());
}
for (RelationComponent c: relationComponents()) {
sb.append(" ");
sb.append(c.generateAbstractGrammar());
}
sb.append(";\n");
}
public String Component.generateAbstractGrammar() {
if (getID().equals(getTypeUse().toString())) {
return getTypeUse().toString();
} else {
return getID() + ":" + getTypeUse();
}
}
public String ListComponent.generateAbstractGrammar() {
return super.generateAbstractGrammar() + "*";
}
public String OptComponent.generateAbstractGrammar() {
return "[" + super.generateAbstractGrammar() + "]";
}
public String TokenComponent.generateAbstractGrammar() {
return "<" + getID() + ":" + getTypeUse() + ">";
}
public String RelationComponent.generateAbstractGrammar() {
return "<_impl_" + getID() + ":" + ofTypeDecl() + ">";
}
public String ManyRelationComponent.generateAbstractGrammar() {
return "<_impl_" + getID() + ":MySet<" + ofTypeDecl() + ">>";
}
}
\ No newline at end of file
......@@ -16,7 +16,7 @@ aspect Errors {
to Program.errors();
Component contributes error("Component '" + name()
+ "' is already declared for type '" + typeDecl() + "'")
+ "' is already declared for type '" + toTypeDecl() + "'")
when isAlreadyDeclared()
to Program.errors();
}
......
......@@ -66,7 +66,7 @@ RelationComponent relation_comp =
| LBRACKET type_use.u DOT ID RBRACKET {: return new OptionalRelationComponent(ID, u); :}
| LBRACKET type_use.u RBRACKET {: return new OptionalRelationComponent("", u); :}
// Many
| type_use.u STAR DOT ID {: return new ManyRelationComponent(ID, u); :}
| type_use.u DOT ID STAR {: return new ManyRelationComponent(ID, u); :}
| type_use.u STAR {: return new ManyRelationComponent("", u); :}
;
......
......@@ -40,7 +40,7 @@ public class Compiler {
}
System.exit(1);
} else {
System.out.println(p.dumpTree());
System.out.println(p.generateAbstractGrammar());
}
/* } else {
if (optionPrintDot.isSet()) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment