source: default/v2/trunk/de.ugoe.cs.swe.bnftools.ebnf/src/de/ugoe/cs/swe/bnftools/generator/EbnfGenerator.xtend @ 84

Last change on this file since 84 was 84, checked in by hkaulbersch, 10 years ago

commit: generator improved

File size: 5.4 KB
Line 
1/*
2 * generated by Xtext
3 */
4package de.ugoe.cs.swe.bnftools.generator
5
6import de.ugoe.cs.swe.bnftools.ebnf.Atom
7import de.ugoe.cs.swe.bnftools.ebnf.BnfEntry
8import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList
9import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf
10import de.ugoe.cs.swe.bnftools.ebnf.GroupedSequence
11import de.ugoe.cs.swe.bnftools.ebnf.OptionalSequence
12import de.ugoe.cs.swe.bnftools.ebnf.RepeatedSequence
13import de.ugoe.cs.swe.bnftools.ebnf.Rule
14import de.ugoe.cs.swe.bnftools.ebnf.RuleReference
15import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition
16import de.ugoe.cs.swe.bnftools.ebnf.StringRule
17import de.ugoe.cs.swe.bnftools.ebnf.Term
18import java.io.File
19import org.eclipse.emf.ecore.resource.Resource
20import org.eclipse.xtext.generator.IFileSystemAccess
21import org.eclipse.xtext.generator.IFileSystemAccessExtension2
22import org.eclipse.xtext.generator.IGenerator
23
24/**
25 * Generates code from your model files on save.
26 *
27 * see http://www.eclipse.org/Xtext/documentation.html#TutorialCodeGeneration
28 */
29class EbnfGenerator implements IGenerator {
30
31
32 def void doGenerate(Resource resource, IFileSystemAccess fsa,boolean mode) {
33                var String workspacePath = WorkspaceResolver.getWorkspace();
34                for (e : resource.allContents.toIterable.filter(EtsiBnf)) {
35                        if (e.bnfEntry.size != 0) {
36                                fsa.generateFile(e.name + ".fo", e.compile)
37
38                                //generate pdf
39                                var uri = (fsa as IFileSystemAccessExtension2).getURI(e.name + ".fo");
40                                var String fullUri = workspacePath + uri.path.substring(10, uri.path.length);
41                                var File file = new File(fullUri);
42
43                                if (file.exists) {
44                                        //true -> pdf, false -> rtf
45                                       
46                                        if(mode){
47                                                FoToPdfOrRtf.createRtfFromFo(fullUri.substring(0, fullUri.length - 3));
48                                        }else{
49                                                FoToPdfOrRtf.createPdfFromFo(fullUri.substring(0, fullUri.length - 3));
50                                        }
51                                       
52//                                      fsa.deleteFile(e.name + ".fo");
53                                }
54                        }
55                }
56        }
57       
58        override void doGenerate(Resource resource, IFileSystemAccess fsa) {
59                var String workspacePath = WorkspaceResolver.getWorkspace();
60                for (e : resource.allContents.toIterable.filter(EtsiBnf)) {
61                        if (e.bnfEntry.size != 0) {
62                                fsa.generateFile(e.name + ".fo", e.compile)
63                                System.out.println("fo generated");
64                                //generate pdf
65                                var uri = (fsa as IFileSystemAccessExtension2).getURI(e.name + ".fo");
66                                var String fullUri = workspacePath + uri.path.substring(10, uri.path.length);
67                                var File file = new File(fullUri);
68
69                                if (file.exists) {
70                                       
71                                        FoToPdfOrRtf.createPdfFromFo(fullUri.substring(0, fullUri.length - 3));
72//                                      fsa.deleteFile(e.name + ".fo");
73                                }
74                        }
75                }
76        }
77
78        // compile the different entities of the Bnf-----------------------------------------------------------------------------
79        def compile(EtsiBnf bnf) '''
80        <?xml version="1.0"?>
81        <!-- fop «bnf.name».xml -rtf «bnf.name».rtf -->
82        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
83       
84                <fo:layout-master-set>
85                                <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm">
86                                                <fo:region-body region-name="xsl-region-body"  margin="2cm"/>
87                                                </fo:simple-page-master>
88                </fo:layout-master-set>
89       
90                <fo:page-sequence  master-reference="A4">
91                        <fo:flow flow-name="xsl-region-body" font-family="verdana">
92                               
93                                <fo:block span="all"  text-align="center" text-indent="1em" font-family="Arial" font-size="20pt" font-weight="bold" background-color="#EEEEEE" line-height="20mm">«bnf.
94                name»</fo:block>
95                                               
96                                «FOR bnfentry : bnf.bnfEntry»
97                                        «bnfentry.compile»
98                                «ENDFOR»
99                        </fo:flow>
100                </fo:page-sequence>
101        </fo:root>'''
102
103        def compile(BnfEntry bnfEntry) '''
104                «IF bnfEntry.rule != null»
105                        «bnfEntry.rule.compile»
106                «ENDIF»
107        '''
108
109        def compile(Rule rule) '''«System.out.println(rule.name)»<fo:block><fo:inline id="«rule.name»"  color="purple">«IF rule.rulenumber != 0»«rule.
110                rulenumber».    «ENDIF»«rule.name»</fo:inline>  ::=     «rule.definitionList.compile»</fo:block>'''
111
112        def compile(DefinitionList dList) '''«IF dList!= null»«FOR sDef : dList.singleDefinition»«sDef.compile»«IF !sDef.equals(
113                dList.singleDefinition.last)» | «ENDIF»«ENDFOR»«ENDIF»'''
114
115        def compile(SingleDefinition sDefinition) '''«FOR term : sDefinition.terms»«term.compile»«ENDFOR»'''
116
117        def compile(Term term) '''«IF term.termAtom != null»«term.termAtom.compile»«ENDIF»«IF term.termOptionalSequence !=
118                null»«term.termOptionalSequence.compile»«ENDIF»«IF term.termRepeatedSequence != null»«term.termRepeatedSequence.
119                compile»«ENDIF»«IF term.termGroupedSequence != null»«term.termGroupedSequence.compile»«ENDIF»'''
120
121        def compile(GroupedSequence gSequ) '''«FOR d : gSequ.definitionList»«d.compile»«ENDFOR»'''
122
123        def compile(RepeatedSequence rSequ) '''{«FOR d : rSequ.definitions»«d.compile»«ENDFOR»}«IF rSequ.morethanonce»+«ENDIF»'''
124
125        def compile(OptionalSequence oSequ) '''(«FOR d : oSequ.definitionList»«d.compile»«ENDFOR»)'''
126
127        def compile(Atom atom) '''
128        «IF atom.atomRuleReference != null»«atom.atomRuleReference.compile»«ENDIF»«IF atom.atomStringRule != null»«atom.
129                atomStringRule.compile»«ENDIF»'''
130
131        def compile(RuleReference rRef) '''<fo:basic-link internal-destination="«rRef.ruleref.name»" text-decoration="underline" color="blue">«rRef.
132                ruleref.name»</fo:basic-link>   '''
133
134        def compile(StringRule sRule) '''«IF sRule.colon != null»«sRule.colon»«ENDIF»«IF sRule.literal != null»«sRule.
135                literal.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")»  «ENDIF»'''
136
137}
Note: See TracBrowser for help on using the repository browser.