/* Minijava Grammar */ import java_cup.runtime.ComplexSymbolFactory; import java_cup.runtime.ScannerBuffer; import java_cup.runtime.XMLElement; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; parser code {: public Parser(Lexer lex, ComplexSymbolFactory sf) { super(lex,sf); } public static void main(String[] args) throws Exception { // initialize the symbol factory ComplexSymbolFactory csf = new ComplexSymbolFactory(); // create a buffering scanner wrapper ScannerBuffer lexer = new ScannerBuffer(new Lexer(new BufferedReader(new FileReader(args[0])),csf)); // start parsing Parser p = new Parser(lexer,csf); XMLElement e = (XMLElement)p.parse().value; // create XML output file XMLOutputFactory outFactory = XMLOutputFactory.newInstance(); XMLStreamWriter sw = outFactory.createXMLStreamWriter(new FileOutputStream(args[1]), "UTF-8"); // dump XML output to the file XMLElement.dump(lexer,sw,e,"expr","stmt"); // transform the parse tree into an AST and a rendered HTML version Transformer transformer = TransformerFactory.newInstance() .newTransformer(new StreamSource(new File("tree.xsl"))); Source text = new StreamSource(new File(args[1])); transformer.transform(text, new StreamResult(new File("output.xml"))); transformer = TransformerFactory.newInstance() .newTransformer(new StreamSource(new File("tree-view.xsl"))); text = new StreamSource(new File("output.xml")); transformer.transform(text, new StreamResult(new File("ast.html"))); } :}; terminal SEMICOLON, COMMA, DOT, LPAR, RPAR, BEGIN, END, ASSIGN; terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS; terminal TYPE; terminal IDENT, STRINGCONST; non terminal policy, intface, methlist, meth, paramlist, param; non terminal capablist, capab, capabcont, cont; non terminal reqlist, require, capintlist; /** * A policy file normally consists of 3 parts: * 1) Interface (in Java syntax) * 2) List of capabilities and their contents * 3) List of interface generation definitions */ policy ::= intface:in capablist:cap reqlist:rl ; // Interface class definition intface ::= PUBLIC INTERFACE IDENT:idint BEGIN methlist:ml END | /* empty */ ; methlist ::= methlist:ml meth:m | /* empty */ ; meth ::= PUBLIC TYPE:typemeth IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLON ; paramlist ::= paramlist:pl param:p | /* empty */ ; param ::= TYPE:typeprm IDENT:idprm COMMA | TYPE:typeprm IDENT:idprm | IDENT:clsprm IDENT:idprm COMMA | IDENT:clsprm IDENT:idprm ; // List of capabilities and their respective contents, i.e. description, method, etc. capablist ::= capablist:clist capab:cap | /* empty */ ; capab ::= CAPABILITY IDENT:idint DOT IDENT:idcap BEGIN capabcont:ccont END ; capabcont ::= capabcont:ccont cont:cnt | /* empty */ ; cont ::= DESCRIPTION:dsc ASSIGN STRINGCONST SEMICOLON | METHOD:mtd ASSIGN IDENT:idmeth SEMICOLON ; // List of interface generation definitions reqlist ::= reqlist:rl require:req | /* empty */ ; require ::= REQUIRES IDENT:idint WITH capintlist:cil AS INTERFACE IDENT:idnewint SEMICOLON ; capintlist ::= IDENT:idcap | capintlist:cil COMMA IDENT:idcap | /* empty */ ;