2 import java_cup.runtime.ComplexSymbolFactory;
3 import java_cup.runtime.ScannerBuffer;
4 import java_cup.runtime.XMLElement;
5 import javax.xml.stream.XMLOutputFactory;
6 import javax.xml.stream.XMLStreamWriter;
9 import javax.xml.transform.*;
10 import javax.xml.transform.stream.*;
12 public Parser(Lexer lex, ComplexSymbolFactory sf) {
15 public static void main(String[] args) throws Exception {
16 // initialize the symbol factory
17 ComplexSymbolFactory csf = new ComplexSymbolFactory();
18 // create a buffering scanner wrapper
19 ScannerBuffer lexer = new ScannerBuffer(new Lexer(new BufferedReader(new FileReader(args[0])),csf));
21 Parser p = new Parser(lexer,csf);
22 XMLElement e = (XMLElement)p.parse().value;
23 // create XML output file
24 XMLOutputFactory outFactory = XMLOutputFactory.newInstance();
25 XMLStreamWriter sw = outFactory.createXMLStreamWriter(new FileOutputStream(args[1]), "UTF-8");
26 // dump XML output to the file
27 XMLElement.dump(lexer,sw,e,"expr","stmt");
29 // transform the parse tree into an AST and a rendered HTML version
30 Transformer transformer = TransformerFactory.newInstance()
31 .newTransformer(new StreamSource(new File("tree.xsl")));
32 Source text = new StreamSource(new File(args[1]));
33 transformer.transform(text, new StreamResult(new File("output.xml")));
34 transformer = TransformerFactory.newInstance()
35 .newTransformer(new StreamSource(new File("tree-view.xsl")));
36 text = new StreamSource(new File("output.xml"));
37 transformer.transform(text, new StreamResult(new File("ast.html")));
41 terminal SEMICOLON, COMMA, DOT, LPAR, RPAR, BEGIN, END, ASSIGN;
42 terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS;
44 terminal IDENT, STRINGCONST;
46 non terminal policy, intface, methlist, meth, paramlist, param;
47 non terminal capablist, capab, capabcont, cont;
48 non terminal reqlist, require, capintlist;
51 * A policy file normally consists of 3 parts:
52 * 1) Interface (in Java syntax)
53 * 2) List of capabilities and their contents
54 * 3) List of interface generation definitions
56 policy ::= intface:in capablist:cap reqlist:rl
59 // Interface class definition
60 intface ::= PUBLIC INTERFACE IDENT:idint BEGIN methlist:ml END
63 methlist ::= methlist:ml meth:m
66 meth ::= PUBLIC TYPE:typemeth IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLON
68 paramlist ::= paramlist:pl param:p
71 param ::= TYPE:typeprm IDENT:idprm COMMA
72 | TYPE:typeprm IDENT:idprm
73 | IDENT:clsprm IDENT:idprm COMMA
74 | IDENT:clsprm IDENT:idprm
77 // List of capabilities and their respective contents, i.e. description, method, etc.
78 capablist ::= capablist:clist capab:cap
81 capab ::= CAPABILITY IDENT:idint DOT IDENT:idcap BEGIN capabcont:ccont END
83 capabcont ::= capabcont:ccont cont:cnt
86 cont ::= DESCRIPTION:dsc ASSIGN STRINGCONST SEMICOLON
87 | METHOD:mtd ASSIGN IDENT:idmeth SEMICOLON
90 // List of interface generation definitions
91 reqlist ::= reqlist:rl require:req
94 require ::= REQUIRES IDENT:idint WITH capintlist:cil AS INTERFACE IDENT:idnewint SEMICOLON
96 capintlist ::= IDENT:idcap
97 | capintlist:cil COMMA IDENT:idcap