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

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

fixed imports

File size: 3.9 KB
Line 
1/*
2 * generated by Xtext
3 */
4package de.ugoe.cs.swe.bnftools.generator
5
6import org.eclipse.emf.ecore.resource.Resource
7import org.eclipse.xtext.generator.IGenerator
8import org.eclipse.xtext.generator.IFileSystemAccess
9import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf
10import de.ugoe.cs.swe.bnftools.ebnf.BnfEntry
11import de.ugoe.cs.swe.bnftools.ebnf.Rule
12import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList
13import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition
14import de.ugoe.cs.swe.bnftools.ebnf.Term
15import de.ugoe.cs.swe.bnftools.ebnf.GroupedSequence
16import de.ugoe.cs.swe.bnftools.ebnf.Atom
17import de.ugoe.cs.swe.bnftools.ebnf.RepeatedSequence
18import de.ugoe.cs.swe.bnftools.ebnf.OptionalSequence
19import de.ugoe.cs.swe.bnftools.ebnf.RuleReference
20import de.ugoe.cs.swe.bnftools.ebnf.StringRule
21import java.io.File
22
23/**
24 * Generates code from your model files on save.
25 *
26 * see http://www.eclipse.org/Xtext/documentation.html#TutorialCodeGeneration
27 */
28class EbnfGenerator implements IGenerator {
29        //generation of the xsl-file
30        override void doGenerate(Resource resource, IFileSystemAccess fsa) {
31                for (e : resource.allContents.toIterable.filter(EtsiBnf)) {
32                        if (e.bnfEntry.size!=0) {
33                                 fsa.generateFile(e.name + ".fo", e.compile)
34                        }
35                }
36        }
37
38        // compile the different entities of the Bnf-----------------------------------------------------------------------------
39        def compile(EtsiBnf bnf)
40        '''
41        <?xml version="1.0"?>
42        <!-- fop «bnf.name».xml -rtf «bnf.name».rtf -->
43        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
44
45                <fo:layout-master-set>
46                        <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm">
47                        <fo:region-body region-name="xsl-region-body"  margin="2cm"/>
48                </fo:simple-page-master>
49                </fo:layout-master-set>
50       
51                <fo:page-sequence  master-reference="A4">
52                        <fo:flow flow-name="xsl-region-body" font-family="verdana">
53                               
54                                <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.name»</fo:block>
55                                               
56                                «FOR bnfentry:bnf.bnfEntry»
57                                        «bnfentry.compile»
58                                «ENDFOR»
59                        </fo:flow>
60                </fo:page-sequence>
61        </fo:root>'''
62       
63        def compile(BnfEntry bnfEntry)'''
64                «IF bnfEntry.rule!= null»
65                                «bnfEntry.rule.compile»
66                «ENDIF»
67        '''
68       
69        def compile(Rule rule)'''<fo:block><fo:inline id="«rule.name»"  color="purple">«IF rule.rulenumber!=0»«rule.rulenumber».        «ENDIF»«rule.name»</fo:inline>  ::=     «rule.definitionList.compile»</fo:block>'''
70       
71        def compile(DefinitionList dList)'''«FOR sDef:dList.singleDefinition»«sDef.compile»«IF !sDef.equals(dList.singleDefinition.last)» | «ENDIF»«ENDFOR»'''
72       
73        def compile(SingleDefinition sDefinition)'''«FOR term:sDefinition.terms»«term.compile»«ENDFOR»'''
74       
75        def compile(Term term)'''«IF term.termAtom!=null»«term.termAtom.compile»«ENDIF»«IF term.termOptionalSequence!=null»«term.termOptionalSequence.compile»«ENDIF»«IF term.termRepeatedSequence!=null»«term.termRepeatedSequence.compile»«ENDIF»«IF term.termGroupedSequence!=null»«term.termGroupedSequence.compile»«ENDIF»'''
76       
77        def compile(GroupedSequence gSequ)'''«FOR d :gSequ.definitionList»«d.compile»«ENDFOR»'''
78
79        def compile(RepeatedSequence rSequ)'''{«FOR d:rSequ.definitions»«d.compile»«ENDFOR»}«IF rSequ.morethanonce»+«ENDIF»'''
80       
81        def compile(OptionalSequence oSequ)'''(«FOR d:oSequ.definitionList»«d.compile»«ENDFOR»)'''
82       
83        def compile(Atom atom)'''
84        «IF atom.atomRuleReference!= null»«atom.atomRuleReference.compile»«ENDIF»«IF atom.atomStringRule!= null»«atom.atomStringRule.compile»«ENDIF»'''
85       
86        def compile(RuleReference rRef)'''<fo:basic-link internal-destination="«rRef.ruleref.name»" text-decoration="underline" color="blue">«rRef.ruleref.name»</fo:basic-link>        '''
87       
88        def compile(StringRule sRule)'''«IF sRule.colon!=null»«sRule.colon»«ENDIF»«IF sRule.literal!=null»«sRule.literal»       «ENDIF»'''
89       
90       
91}
Note: See TracBrowser for help on using the repository browser.