/*
* 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
import de.ugoe.cs.swe.bnftools.ebnf.Comment
/**
* 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»
«IF bnfEntry.comment!= null»
«bnfEntry.comment.compile»
«ENDIF»
'''
def compile(SectionHeading sHeading) '''
«sHeading.sectionHeader»
'''
def compile(Comment comment) '''
«comment.content.replaceAll('<','<').replaceAll('>','>')»
'''
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»'''
}