First version of parser; Generates AST in XML and HTML format.
[iot2.git] / others / javacup / iotparser.cup
1 /* Minijava Grammar */
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;
7 import java.io.*;
8
9 import javax.xml.transform.*;
10 import javax.xml.transform.stream.*;
11 parser code {:
12   public Parser(Lexer lex, ComplexSymbolFactory sf) {
13     super(lex,sf);
14   }
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));
20       // start parsing
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");
28
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")));
38   }
39 :};
40
41 terminal SEMICOLON, COMMA, DOT, LPAR, RPAR, BEGIN, END, ASSIGN;
42 terminal PUBLIC, INTERFACE, CAPABILITY, DESCRIPTION, METHOD, REQUIRES, WITH, AS; 
43 terminal TYPE;
44 terminal IDENT, STRINGCONST;
45
46 non terminal policy, intface, methlist, meth, paramlist, param;
47 non terminal capablist, capab, capabcont, cont;
48 non terminal reqlist, require, capintlist;
49
50 /**
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
55  */
56 policy     ::= intface:in capablist:cap reqlist:rl
57     ;
58
59 // Interface class definition
60 intface    ::= PUBLIC INTERFACE IDENT:idint BEGIN methlist:ml END
61     | /* empty */
62     ;
63 methlist   ::= methlist:ml meth:m
64     | /* empty */
65     ;
66 meth       ::= PUBLIC TYPE:typemeth IDENT:idmeth LPAR paramlist:pl RPAR SEMICOLON
67     ;
68 paramlist  ::= paramlist:pl param:p
69     | /* empty */
70     ;
71 param      ::= TYPE:typeprm IDENT:idprm COMMA
72     | TYPE:typeprm IDENT:idprm
73     | IDENT:clsprm IDENT:idprm COMMA
74     | IDENT:clsprm IDENT:idprm
75     ;
76
77 // List of capabilities and their respective contents, i.e. description, method, etc.
78 capablist  ::= capablist:clist capab:cap
79         | /* empty */
80         ;
81 capab      ::= CAPABILITY IDENT:idint DOT IDENT:idcap BEGIN capabcont:ccont END
82     ;
83 capabcont  ::= capabcont:ccont cont:cnt
84         | /* empty */
85         ;
86 cont       ::= DESCRIPTION:dsc ASSIGN STRINGCONST SEMICOLON
87         | METHOD:mtd ASSIGN IDENT:idmeth SEMICOLON
88         ;
89
90 // List of interface generation definitions
91 reqlist    ::= reqlist:rl require:req
92         | /* empty */
93         ;
94 require    ::= REQUIRES IDENT:idint WITH capintlist:cil AS INTERFACE IDENT:idnewint SEMICOLON
95         ;
96 capintlist ::= IDENT:idcap
97         | capintlist:cil COMMA IDENT:idcap
98         | /* empty */
99         ;
100