CompilerGeneration.jrag 18.2 KB
Newer Older
1
2
/* -*-Java-*- */

3
4
5
6
7
8
/* 
 * Copyright (C) 2006  Anders Nilsson <anders.nilsson@cs.lth.se>
 *
 * This file is part of OntologyCompiler.
 */

9
import java.io.*;
10
import java.util.*;
11

12
aspect AbsGrammarGeneration {
13
    void ASTNode.genAbsGrammar(PrintStream pStream) {
14
15
16
		for (int i=0; i<getNumChild(); i++) {
			getChild(i).genAbsGrammar(pStream);
		}
17
18
    }

19
    public void Start.genAbsGrammar(PrintStream pStream) {
20
		pStream.println("// Predefined types");
Anders Nilsson's avatar
Anders Nilsson committed
21
		pStream.println("Start ::= Element*;");
Anders Nilsson's avatar
Anders Nilsson committed
22
		pStream.println("abstract Thing : ComplexElement ::=;");
23
		pStream.println("abstract Element;");
Anders Nilsson's avatar
Anders Nilsson committed
24
 		pStream.println("ComplexElement : Element ::=  OwlIdentifier Attribute* Element*;");
25
		pStream.println("ValueElement : ComplexElement;");
Anders Nilsson's avatar
Anders Nilsson committed
26
		pStream.println("RdfDeclaration : ComplexElement;");
27
		pStream.println("abstract SimpleElement : Element;");
28
29
30
		pStream.println("StringElement : SimpleElement ::= <LITERAL>;");
		pStream.println("IntElement : SimpleElement ::= <LITERAL>;");
		pStream.println("FloatElement : SimpleElement ::= <LITERAL>;");
31
		pStream.println("ClassUse : Thing  ::= /decl:Thing/;");
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
		pStream.println("Attribute ::= Value;");
		pStream.println("RdfDatatype : Attribute ::= ;");
		pStream.println("RdfId : Attribute ::= ;");
		pStream.println("Xmlns : Attribute ::= ;");
		pStream.println("XmlnsProtege : Attribute ::= ;");
		pStream.println("XmlnsRdf : Attribute ::= ;");
		pStream.println("XmlnsXsd : Attribute ::= ;");
		pStream.println("XmlnsRdfs : Attribute ::= ;");
		pStream.println("XmlnsOwl : Attribute ::= ;");
		pStream.println("XmlnsDaml : Attribute ::= ;");
		pStream.println("XmlnsP1 : Attribute ::= ;");
		pStream.println("XmlnsDc : Attribute ::= ;");
		pStream.println("XmlBase : Attribute ::= ;");
		pStream.println("RdfResource : Attribute ::= ;");
		pStream.println("RdfAbout : Attribute ::= ;");
		pStream.println("RdfParseType : Attribute ::= ;");
		pStream.println("Version : Attribute ::= ;");
		pStream.println("Value ::= <STRING_LITERAL>;");
50
		pStream.println("OwlIdentifier ::= <IDENTIFIER>;");
51
52
53
		pStream.println("AttrValue ::= <STRING_LITERAL>;");
		pStream.println();
		pStream.println("// Generated types");
54
		super.genAbsGrammar(pStream);
55
56
    }

57
    void OwlClassDecl.genAbsGrammar(PrintStream pStream) {
58
59
60
		pStream.print(getId());
		pStream.print(" : "+getSuperClass().getId());	
		pStream.print(" ::=");
61
		getOwnRestrictions().genAbsGrammar(pStream);
62
		pStream.println(";");
63
64
    }

65
66
67
68
69
70
71
	void Restrictions.genAbsGrammar(PrintStream pStream) {
		for (int i=0; i<getNumOwlRestriction(); i++) {
			pStream.print(" ");
			getOwlRestriction(i).genAbsGrammar(pStream);
		}
	}

72
    void OwlRestriction.genAbsGrammar(PrintStream pStream) {
Anders Nilsson's avatar
Anders Nilsson committed
73
		pStream.print(name());
74
		pStream.print(":Thing");
75
76
77
		if (allValuesFrom()) {
			pStream.print("*");
		}
78
    }
79

80
81
82
83
84
85
86
87
    String OwlRestriction.getRestrictionPropertyId() {
		for (int i=0; i<getNumElement(); i++) {
			ComplexElement e = (ComplexElement) getElement(i);
			if (e instanceof OwlOnProperty) {
				return e.getId(); 
			}
		}
		return "_Unknown_";
88
89
    } 

90
91
92
93
94
95
96
97
98
    String OwlRestriction.getRestrictionClassId() {
		for (int i=0; i<getNumElement(); i++) {
			ComplexElement e = (ComplexElement) getElement(i);
			if (e instanceof OwlAllValuesFrom || 
				e instanceof OwlSomeValuesFrom) {
				return e.getId(); // Ugly as hell!!
			}
		}
		return "_Unknown_";
99
100
101
    } 

    syn lazy boolean OwlRestriction.allValuesFrom() {
102
103
104
105
106
107
		for (int i=0; i<getNumElement(); i++) {
			if (getElement(i) instanceof OwlAllValuesFrom) {
				return true;
			}
		}
		return false;
108
109
    }

110
111
}

112
113
114
115
116
117
aspect GenAspects {
	public void Start.genAspects(PrintStream pStream) {
		pStream.println();
		pStream.println("import java.io.PrintStream;");
		pStream.println();
		genRewrites(pStream);
118
		genMisc(pStream);
119
		genPrettyPrinter(pStream);
120
121
122
	}
}

123
aspect GenPrettyPrinter {
124
	public void ASTNode.genPrettyPrinter(PrintStream pStream) {
125
		for (int i=0; i<getNumChild(); i++) {
126
			getChild(i).genPrettyPrinter(pStream);
127
		}
128
129
	}

130
	public void Start.genPrettyPrinter(PrintStream pStream) {
131
		pStream.println();
132
133
134
		pStream.println("aspect PrettyPrinter {");
		pStream.println("  public void ASTNode.prettyPrint(String indent, PrintStream pStream) {");
		pStream.println("    for (int i=0; i<getNumChild(); i++) {");
135
		pStream.println("      getChild(i).prettyPrint(indent,pStream);");
136
		pStream.println("    }");
137
		pStream.println("  }\n");
Anders Nilsson's avatar
Anders Nilsson committed
138
139
140
141
		pStream.println("  public void Start.prettyPrint(String indent, PrintStream pStream) {");
		pStream.println("    for (int i=0; i<getNumElement(); i++) {");
		pStream.println("      getElement(i).prettyPrint(indent,pStream);");
		pStream.println("    }");
142
143
		pStream.println("  }\n");
		pStream.println("  syn String Attribute.id() = \"\";");
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
		pStream.println("  eq RdfAbout.id() = \"rdf:about\";");
		pStream.println("  eq RdfDatatype.id() = \"rdf:datatype\";");
		pStream.println("  eq RdfId.id() = \"rdf:ID\";");
		pStream.println("  eq RdfParseType.id() = \"rdf:parseType\";");
		pStream.println("  eq RdfResource.id() = \"rdf:resource\";");
		pStream.println("  eq XmlBase.id() = \"xml:base\";");
		pStream.println("  eq Xmlns.id() = \"xmlns\";");
		pStream.println("  eq XmlnsDaml.id() = \"xmlns:daml\";");
		pStream.println("  eq XmlnsDc.id() = \"xmlns:dc\";");
		pStream.println("  eq XmlnsOwl.id() = \"xmlns:owl\";");
		pStream.println("  eq XmlnsP1.id() = \"xmlns:p1\";");
		pStream.println("  eq XmlnsProtege.id() = \"xmlns:protege\";");
		pStream.println("  eq XmlnsRdf.id() = \"xmlns:rdf\";");
		pStream.println("  eq XmlnsRdfs.id() = \"xmlns:rdfs\";");
		pStream.println("  eq XmlnsXsd.id() = \"xmlns:xsd\";");
159
160
		pStream.println("  public void Attribute.prettyPrint(String indent, PrintStream pStream) {");
		pStream.println("    System.out.print(\" \"+id()+\"=\"+getValue().getSTRING_LITERAL());");
Anders Nilsson's avatar
Anders Nilsson committed
161
		pStream.println("  }\n");
162
163
164
165
166
167
168
169
170
		pStream.println(ind(1)+"public void ValueElement.prettyPrint(String indent, PrintStream pStream) {");
		pStream.println(ind(2)+"System.out.print(indent+\"<value \");");
		pStream.println(ind(2)+"for (int i=0; i<getNumAttribute(); i++) {");
		pStream.println(ind(3)+"getAttribute(i).prettyPrint(indent,pStream);");
		pStream.println(ind(2)+"}");
		pStream.println(ind(2)+"System.out.println(\">\");");
		pStream.println(ind(2)+"System.out.println(indent+\"  \"+value());");
		pStream.println(ind(2)+"System.out.println(indent+\"</value>\");");
		pStream.println(ind(1)+"}\n");
171
172
173
174
175
176
177
178
		// Generate prettyprinter for ClassUse
		pStream.println(ind(1)+"public void ClassUse.prettyPrint(String indent, PrintStream pStream) {");
		pStream.println(ind(2)+"System.out.print(indent+\"<\"+name());");
		pStream.println(ind(2)+"for (int i=0; i<getNumAttribute(); i++) {");
		pStream.println(ind(3)+"getAttribute(i).prettyPrint(indent,pStream);");
		pStream.println(ind(2)+"}");
		pStream.println(ind(2)+"System.out.println(\"/>\");");
		pStream.println(ind(1)+"}\n");
179
		super.genPrettyPrinter(pStream);
180
181
182
		pStream.println("}\n");
	}

183
	public void OwlClassDecl.genPrettyPrinter(PrintStream pStream) {
184
		// Generate prettyprinter for class declaration
185
		pStream.print(ind(1)+"public void "+name());
186
		pStream.println(".prettyPrint(String indent, PrintStream pStream) {");
187
188
189
190
191
192
		pStream.println(ind(2)+"System.out.print(indent+\"<"+name()+"\");");
		pStream.println(ind(2)+"for (int i=0; i<getNumAttribute(); i++) {");
		pStream.println(ind(3)+"getAttribute(i).prettyPrint(indent,pStream);");
		pStream.println(ind(2)+"}");
		pStream.println("System.out.println(\">\");");
		pStream.println(ind(2)+"String childIndent = indent + \"  \";");
Anders Nilsson's avatar
Anders Nilsson committed
193
194
195
196
197
198
199
200
201
202
203
204
// 		Restrictions restr = getRestrictions();
// 		for (int i=0; i<restr.getNumOwlRestriction(); i++) {
// 			OwlRestriction r = restr.getOwlRestriction(i);
// 			pStream.println(ind(2)+"System.out.println(childIndent+\"<has"+
// 							r.name()+">\");");
// 			pStream.println(ind(2)+"for (int i=0; i<getNum"+r.name()+"(); i++) {");
// 			pStream.println(ind(3)+"get"+r.name()+
// 							"(i).prettyPrint(childIndent+\"  \",pStream);");
// 			pStream.println(ind(2)+"}");
// 			pStream.println(ind(2)+"System.out.println(childIndent+\"</has"+
// 							r.name()+">\");");
// 		}
205
206
207
		pStream.println(ind(2)+"for (int i=0; i<getNumElement(); i++) {");
		pStream.println(ind(3)+"getElement(i).prettyPrint(childIndent,pStream);");
		pStream.println(ind(2)+"}");
208
209
		pStream.println(ind(1)+"System.out.println(indent+\"</"+name()+">\");");
		pStream.println(ind(1)+"}\n");		
210
211
212
213
214
215
216
217
218
219
220
221
222
223
	}
}

aspect GenRewrites {

    public void ASTNode.genRewrites(PrintStream pStream) {
		for (int i=0; i<getNumChild(); i++) {
			getChild(i).genRewrites(pStream);
		}
    }

	public void Start.genRewrites(PrintStream pStream) {
		pStream.println();
		pStream.println("aspect Rewrites {");
224
		pStream.println(ind(1)+"rewrite ComplexElement {");
225
		pStream.println(ind(2)+"when (!(this instanceof ClassUse) && getOwlIdentifier().getIDENTIFIER().equals(\"value\") && !(this instanceof ValueElement))");
226
227
228
229
230
231
232
233
		pStream.println(ind(3)+"to ValueElement {");
		pStream.println(ind(3)+"ValueElement node = new ValueElement();");
		pStream.println(ind(3)+"node.setOwlIdentifier(getOwlIdentifier());");
		pStream.println(ind(3)+"node.setAttributeList(getAttributeList());");
		pStream.println(ind(3)+"node.setElementList(getElementList());");
		pStream.println(ind(3)+"return node;");
		pStream.println(ind(2)+"}");
		pStream.println(ind(1)+"}");
Anders Nilsson's avatar
Anders Nilsson committed
234
235

		// TEMPORARY!!!!!
Anders Nilsson's avatar
Anders Nilsson committed
236
237
		// Rewrite isSkillOf/hasSkill/hasProperty/isPropertyOf to ClassUse.
		// Should probably be auto-generated instead.
Anders Nilsson's avatar
Anders Nilsson committed
238
		pStream.println(ind(1)+"rewrite ComplexElement {");
239
240
241
242
243
244
245
246
247
248
249
// 		pStream.println(ind(2)+"when ((name().equals(\"hasSkill\")");
// 		pStream.println(ind(2)+"|| name().equals(\"hasProperty\"))");
// 		pStream.println("&& getNumAttribute() > 0 && getAttribute(0) instanceof RdfResource)");
// 		pStream.println(ind(2)+"to ClassUse {");
// 		pStream.println(ind(3)+"ClassUse use = new ClassUse();");
// 		pStream.println(ind(3)+"String att = getAttribute(0).name();");
// 		pStream.println(ind(3)+"use.setOwlIdentifier(new OwlIdentifier(att.substring(att.indexOf('#')+1,att.indexOf('_'))));");
// 		pStream.println(ind(3)+"use.setAttributeList(getAttributeList());");
// 		pStream.println(ind(3)+"use.setElementList(new List());");
// 		pStream.println(ind(3)+"return use;");
// 		pStream.println(ind(2)+"}");
Anders Nilsson's avatar
Anders Nilsson committed
250
251
252
253
254
255
		pStream.println(ind(2)+"when (name().equals(\"rdf:RDF\") && !(this instanceof RdfDeclaration))");
		pStream.println(ind(2)+"to RdfDeclaration {");
		pStream.println(ind(3)+"return new RdfDeclaration(getOwlIdentifier(),getAttributeList(),getElementList());");
		pStream.println(ind(2)+"}");


256
257
258
259
260
261
262
263
264
265
266
// 		pStream.println(ind(2)+"when ((name().equals(\"isSkillOf\")");
// 		pStream.println(ind(2)+"|| name().equals(\"isPropertyOf\"))");
// 		pStream.println("&& getNumAttribute() > 0 && getAttribute(0) instanceof RdfResource)");
// 		pStream.println(ind(2)+"to ClassUse {");
// 		pStream.println(ind(3)+"ClassUse use = new ClassUse();");
// 		pStream.println(ind(3)+"String att = getAttribute(0).name();");
// 		pStream.println(ind(3)+"use.setOwlIdentifier(new OwlIdentifier(att.substring(att.indexOf('#')+1,att.indexOf('_'))));");
// 		pStream.println(ind(3)+"use.setAttributeList(getAttributeList());");
// 		pStream.println(ind(3)+"use.setElementList(new List());");
// 		pStream.println(ind(3)+"return use;");
// 		pStream.println(ind(2)+"}");
Anders Nilsson's avatar
Anders Nilsson committed
267
		pStream.println(ind(1)+"}");
Anders Nilsson's avatar
Anders Nilsson committed
268
269
	  

270
		super.genRewrites(pStream);
271
272
		pStream.println("}");
	}
273

274
275
276
	public void OwlClassDecl.genRewrites(PrintStream pStream) {
		String ind = "  ";
		int ix = 0;
277
		// Specialize ComplexElements to the actual class in the ontology
278
		pStream.println(ind(1)+"rewrite ComplexElement {");
279
		pStream.println(ind(2)+"when (!(this instanceof ClassUse) && getOwlIdentifier().getIDENTIFIER().equals(\""+
280
281
						name()+"\") && !(this instanceof Thing))");
		pStream.println(ind(3)+"to "+name()+" {");
282

283
284
285
		pStream.println(ind(3)+name()+" node = new "+name()+"();");
		pStream.println(ind(3)+"node.setOwlIdentifier(getOwlIdentifier());");
		pStream.println(ind(3)+"node.setAttributeList(getAttributeList());");
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
 		pStream.println(ind(3)+"node.setElementList(getElementList());");
// 		Restrictions restr = getRestrictions();
// 		pStream.println(ind(3)+"List l, remain;");
// 		pStream.println(ind(3)+"remain = new List();");
// 		for (int i=0; i<restr.getNumOwlRestriction(); i++) {
// 			OwlRestriction r = restr.getOwlRestriction(i);
// 			pStream.println(ind(3)+"l = new List();");
// 			pStream.println(ind(3)+"for (int i=0; i<getNumElement(); i++) {");
// 			pStream.println(ind(4)+"ComplexElement e = (ComplexElement) getElement(i);");
// 			pStream.println(ind(4)+"if (e.getNumElement() > 0 && e.getElement(0) instanceof "+r.name()+" ) {");
// 			pStream.println(ind(5)+"l.add(e.getElement(0));");
// 			pStream.println(ind(4)+"}");
// 			pStream.println(ind(3)+"}");
// 			if (r.allValuesFrom()) {
// 				pStream.println(ind(3)+"node.set"+r.name()+"List(l);");
// 			} else {
// 				pStream.println(ind(3)+r.name()+" c"+ix+" = new "+r.name()+"();");
// 				pStream.println(ind(3)+"node.set"+r.name()+"(c"+(ix++)+");");
// 			}
// 		}
// 		pStream.println(ind(3)+"for (int i=0; i<getNumElement(); i++) {");
// 		pStream.println(ind(4)+"if (getElement(i) instanceof ValueElement) {");
// 		pStream.println(ind(5)+"remain.add(getElement(i));");
// 		pStream.println(ind(4)+"}");
// 		pStream.println(ind(3)+"}");
//   		pStream.println(ind(3)+"node.setElementList(remain);");
312
313
314
		pStream.println(ind(3)+"return node;");
		pStream.println(ind(2)+"}");
		pStream.println(ind(1)+"}");
Anders Nilsson's avatar
Anders Nilsson committed
315
		pStream.println();
316
317
		// Rearrange device nodes on the AST to get away from the
		// current diagonal style from Protege
Anders Nilsson's avatar
Anders Nilsson committed
318
		pStream.println(ind(1)+"rewrite "+name()+" {");
319
		pStream.println(ind(2)+"when (!isTopElement() && getAttribute(0) instanceof RdfId)");
Anders Nilsson's avatar
Anders Nilsson committed
320
321
322
		pStream.println(ind(2)+"to ClassUse {");
		pStream.println(ind(3)+"ClassUse use = new ClassUse();");
		pStream.println(ind(3)+"use.setOwlIdentifier(new OwlIdentifier(\""+name()+"\"));");
323
324
325
		pStream.println(ind(3)+"String id = getAttribute(0).getValue().getSTRING_LITERAL();");
		pStream.println(ind(3)+"Value val = new Value(\"\\\"#\"+id.substring(1,id.length()));");
		pStream.println(ind(3)+"use.setAttributeList(new List().add(new RdfResource(val)));");
Anders Nilsson's avatar
Anders Nilsson committed
326
327
328
329
330
		pStream.println(ind(3)+"use.setElementList(new List());");
		pStream.println(ind(3)+"getRdfDecl().addElement(this);");
		pStream.println(ind(3)+"return use;");
		pStream.println(ind(2)+"}");
		pStream.println(ind(1)+"}");
331
	}
Anders Nilsson's avatar
Anders Nilsson committed
332

333
}
334

335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
aspect GenMisc {

    public void ASTNode.genMisc(PrintStream pStream) {
		for (int i=0; i<getNumChild(); i++) {
			getChild(i).genMisc(pStream);
		}
    }

	public void Start.genMisc(PrintStream pStream) {
		pStream.println();
		pStream.println("aspect Misc {");
		pStream.println();
		pStream.println(ind(1)+"String ValueElement.value() {");
		pStream.println(ind(2)+"StringBuffer b = new StringBuffer();");
		pStream.println(ind(2)+"for (int i=0; i<getNumElement(); i++) {");
		pStream.println(ind(3)+"b.append(((SimpleElement) getElement(i)).value());");
		pStream.println(ind(3)+"b.append(\" \");");
		pStream.println(ind(2)+"}");
		pStream.println(ind(2)+"return b.toString().trim();");
		pStream.println(ind(1)+"}");
		pStream.println();
Anders Nilsson's avatar
Anders Nilsson committed
356
357

		// SimpleElement.value()
358
		pStream.println(ind(1)+"syn String SimpleElement.value() = \"\";");
359
360
361
		pStream.println(ind(1)+"eq StringElement.value() = getLITERAL();");
		pStream.println(ind(1)+"eq IntElement.value() = getLITERAL();");
		pStream.println(ind(1)+"eq FloatElement.value() = getLITERAL();");
Anders Nilsson's avatar
Anders Nilsson committed
362
		
Anders Nilsson's avatar
Anders Nilsson committed
363
		// Thing.isTopElement()
Anders Nilsson's avatar
Anders Nilsson committed
364
		pStream.println(ind(1)+"boolean Thing.isTopElement() {");
Anders Nilsson's avatar
Anders Nilsson committed
365
		pStream.println(ind(2)+"return getParent().getParent() instanceof RdfDeclaration;");
Anders Nilsson's avatar
Anders Nilsson committed
366
367
		pStream.println(ind(1)+"}");

Anders Nilsson's avatar
Anders Nilsson committed
368
		// ASTNode.getStart()
Anders Nilsson's avatar
Anders Nilsson committed
369
370
371
372
373
374
375
		pStream.println(ind(1)+"Start ASTNode.getStart() {");
		pStream.println(ind(2)+"return getParent().getStart();");
		pStream.println(ind(1)+"}");
		pStream.println(ind(1)+"Start Start.getStart() {");
		pStream.println(ind(2)+"return this;");
		pStream.println(ind(1)+"}");
		
Anders Nilsson's avatar
Anders Nilsson committed
376
		// ASTNode.getRdfDecl()
Anders Nilsson's avatar
Anders Nilsson committed
377
		pStream.println(ind(1)+"RdfDeclaration ASTNode.getRdfDecl() {");
Anders Nilsson's avatar
Anders Nilsson committed
378
379
380
381
382
383
		pStream.println(ind(2)+"return getParent().getRdfDecl();");
		pStream.println(ind(1)+"}");
		pStream.println(ind(1)+"RdfDeclaration RdfDeclaration.getRdfDecl() {");
		pStream.println(ind(2)+"return this;");
		pStream.println(ind(1)+"}");
		
Anders Nilsson's avatar
Anders Nilsson committed
384
		// ComplexElement.name()
385
		pStream.println(ind(1)+"public String ComplexElement.name() {");
386
387
		pStream.println(ind(2)+"return getOwlIdentifier().getIDENTIFIER();");
		pStream.println(ind(1)+"}");
388
		pStream.println(ind(1)+"public String Attribute.name() {");
Anders Nilsson's avatar
Anders Nilsson committed
389
390
		pStream.println(ind(2)+"return getValue().getSTRING_LITERAL();");
		pStream.println(ind(1)+"}");
391

Anders Nilsson's avatar
Anders Nilsson committed
392
		// ClassUse.decl()
Anders Nilsson's avatar
Anders Nilsson committed
393
394
395
// 		pStream.println(ind(1)+"syn lazy Thing ClassUse.decl() {");
// 		pStream.println(ind(2)+
// 		pStream.println(ind(1)+"}\n");
Anders Nilsson's avatar
Anders Nilsson committed
396

397
398
399
400
401
		super.genMisc(pStream);
		pStream.println("}");
	}

}
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444

aspect ParserGen {
	public void Start.genParser(PrintStream pStream) {
		pStream.println("import java.io.FileNotFoundException;");
		pStream.println("import java.io.FileReader;");
		pStream.println("import java.io.InputStreamReader;");
		pStream.println("import java.io.Reader;");
		pStream.println("");
		pStream.println("import AST.SiarasParser;");
		pStream.println("import AST.ParseException;");
		pStream.println("import AST.Start;");
		pStream.println("");
		pStream.println("public class Parser {");
		pStream.println();
		pStream.println("	protected static Start parse(String args[]) {");
		pStream.println("		Reader r = getReader(args);");
		pStream.println("		Start ast = null;");
		pStream.println("		try {");
		pStream.println("			SiarasParser parser = new SiarasParser(r);");
		pStream.println();
		pStream.println("			ast = parser.Start();");
		pStream.println("		} catch (ParseException e) {");
		pStream.println("			System.out.println(e.getMessage());");
		pStream.println("		}");
		pStream.println("		return ast;");
		pStream.println("	}");
		pStream.println();
		pStream.println("	private static Reader getReader(String[] args) {");
		pStream.println("		Reader r = null;");
		pStream.println("		if (args.length != 1) {");
		pStream.println("			r = new InputStreamReader(System.in);");
		pStream.println("		} else {");
		pStream.println("			try {");
		pStream.println("				r = new FileReader(args[0]);");
		pStream.println("			} catch (FileNotFoundException e1) {");
		pStream.println("				System.err.println(\"Dumper: file \" + args[0] + \" not found\");");
		pStream.println("			}");
		pStream.println("		}");
		pStream.println("		return r;");
		pStream.println("	}");
		pStream.println("}");
	}
}