/* * generated by Xtext */ package de.ugoe.cs.swe.bnftools.generator import de.ugoe.cs.swe.bnftools.ebnf.Atom import de.ugoe.cs.swe.bnftools.ebnf.BnfEntry import de.ugoe.cs.swe.bnftools.ebnf.DefinitionList import de.ugoe.cs.swe.bnftools.ebnf.EtsiBnf import de.ugoe.cs.swe.bnftools.ebnf.GroupedSequence import de.ugoe.cs.swe.bnftools.ebnf.OptionalSequence import de.ugoe.cs.swe.bnftools.ebnf.RepeatedSequence import de.ugoe.cs.swe.bnftools.ebnf.Rule import de.ugoe.cs.swe.bnftools.ebnf.RuleReference import de.ugoe.cs.swe.bnftools.ebnf.SingleDefinition import de.ugoe.cs.swe.bnftools.ebnf.StringRule import de.ugoe.cs.swe.bnftools.ebnf.Term import java.io.File import org.eclipse.emf.ecore.resource.Resource import org.eclipse.xtext.generator.IFileSystemAccess import org.eclipse.xtext.generator.IFileSystemAccessExtension2 import org.eclipse.xtext.generator.IGenerator import de.ugoe.cs.swe.bnftools.ebnf.SectionHeading import org.eclipse.core.resources.ResourcesPlugin import de.ugoe.cs.swe.bnftools.ebnf.RepeatRange /** * Generates code from your model files on save. * * see http://www.eclipse.org/Xtext/documentation.html#TutorialCodeGeneration */ class EbnfGenerator implements IGenerator { def void doGenerate(Resource resource, IFileSystemAccess fsa,boolean mode) { var String workspacePath = WorkspaceResolver.getWorkspace(); for (e : resource.allContents.toIterable.filter(EtsiBnf)) { if (e.bnfEntry.size != 0) { fsa.generateFile(e.name + ".fo", e.compile) //generate pdf var uri = (fsa as IFileSystemAccessExtension2).getURI(e.name + ".fo"); var String relativePath = uri.path.substring(10); var String realPath = ResourcesPlugin.getWorkspace().root.findMember(relativePath).rawLocation.toOSString; var File file = new File(realPath); if (file.exists) { //true -> pdf, false -> rtf if(mode){ FoToPdfOrRtf.createRtfFromFo(realPath.substring(0, realPath.length - 3)); }else{ FoToPdfOrRtf.createPdfFromFo(realPath.substring(0, realPath.length - 3)); } // fsa.deleteFile(e.name + ".fo"); } } } } override void doGenerate(Resource resource, IFileSystemAccess fsa) { var String workspacePath = WorkspaceResolver.getWorkspace(); for (e : resource.allContents.toIterable.filter(EtsiBnf)) { if (e.bnfEntry.size != 0) { fsa.generateFile(e.name + ".fo", e.compile) System.out.println("fo generated"); //generate pdf var uri = (fsa as IFileSystemAccessExtension2).getURI(e.name + ".fo"); var String fullUri = workspacePath + uri.path.substring(10, uri.path.length); var File file = new File(fullUri); if (file.exists) { FoToPdfOrRtf.createPdfFromFo(fullUri.substring(0, fullUri.length - 3)); // fsa.deleteFile(e.name + ".fo"); } } } } // compile the different entities of the Bnf----------------------------------------------------------------------------- def compile(EtsiBnf bnf) ''' «bnf. name» «FOR bnfentry : bnf.bnfEntry» «bnfentry.compile» «ENDFOR» ''' def compile(BnfEntry bnfEntry) ''' «IF bnfEntry.rule != null» «bnfEntry.rule.compile» «ENDIF» «IF bnfEntry.sectionheader!= null» «bnfEntry.sectionheader.compile» «ENDIF» ''' def compile(SectionHeading sHeading) ''' «sHeading.sectionHeader» ''' def compile(Rule rule) '''«IF rule.rulenumber != 0»«rule. rulenumber». «ENDIF»«rule.name» ::= «rule.definitionList.compile»''' def compile(DefinitionList dList) '''«IF dList!= null»«FOR sDef : dList.singleDefinition»«sDef.compile+" "»«IF !sDef.equals( dList.singleDefinition.last)»| «ENDIF»«ENDFOR»«ENDIF»''' def compile(SingleDefinition sDefinition) '''«FOR term : sDefinition.terms»«term.compile»«ENDFOR»''' 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» ''' def compile(GroupedSequence gSequ) '''( «FOR d : gSequ.definitionList»«d.compile+" "»«ENDFOR» )''' def compile(RepeatedSequence rSequ) '''{ «FOR d : rSequ.definitions»«d.compile+" "»«ENDFOR» }«IF rSequ.morethanonce»+«ENDIF»«IF rSequ.range!=null»«rSequ.range.compile»«ENDIF»''' def compile(RepeatRange rRange) '''#(«rRange.from»,«rRange.to»)''' def compile(OptionalSequence oSequ) '''[ «FOR d : oSequ.definitionList»«d.compile+" "»«ENDFOR» ]''' def compile(Atom atom) ''' «IF atom.atomRuleReference != null»«atom.atomRuleReference.compile»«ENDIF»«IF atom.atomStringRule != null»«atom. atomStringRule.compile»«ENDIF» ''' def compile(RuleReference rRef) '''«rRef. ruleref.name» ''' def compile(StringRule sRule) '''«IF sRule.colon != null»«sRule.colon»«ENDIF»«IF sRule.literal != null»«'"'+sRule. literal.trim.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")+'"'» «ENDIF»''' }