1 module ruleTranslator; 2 3 import RuleTranslatorLexer; 4 import RuleTranslatorParser : RuleTranslatorParser; 5 import RuleTranslatorBaseListener : RuleTranslatorBaseListener; 6 import RuleWriter: RuleWriter; 7 import IBAListener; 8 import TTSListener; 9 import antlr.v4.runtime.ANTLRInputStream; 10 import antlr.v4.runtime.CommonToken; 11 import antlr.v4.runtime.CommonTokenStream; 12 import antlr.v4.runtime.LexerNoViableAltException; 13 import antlr.v4.runtime.tree.ParseTreeWalker; 14 import std.getopt; 15 import std.path; 16 import std.stdio; 17 import std..string; 18 19 string outputDir; 20 bool verbose; 21 string withPropertyName = "this"; 22 string arguments; 23 enum Version {tts, iba}; 24 Version grammar_version; 25 26 int main(string[] argv) { 27 auto helpInformation = getopt( 28 argv, 29 "dsl-type|d", "DSL source type: tts (default) or iba", &grammar_version, 30 "with|w", "the with (main) property", &withPropertyName, 31 "arguments|a", "string of rule arguments", &arguments, 32 "od", "Output directory name, otherwise print to standard output", &outputDir, 33 "verbose|v", &verbose 34 ); 35 36 if (helpInformation.helpWanted) 37 { 38 defaultGetoptPrinter("Combined Announcement-DSL to IBA-XML/Text-to-speech translator.\n", 39 helpInformation.options); 40 return 0; 41 } 42 if (argv.length > 1) { 43 bool parserFailed = false; 44 45 foreach(filename; argv[1..$]) 46 { 47 if(verbose) 48 { 49 writefln("\nProcessing: %s as %s", filename, grammar_version); 50 } 51 auto antlrInput = new ANTLRInputStream(File(filename, "r")); 52 auto lexer = new RuleTranslatorLexer(antlrInput); 53 auto cts = new CommonTokenStream(lexer); 54 55 // Pass the tokens to the parser 56 auto parser = new RuleTranslatorParser(cts); 57 if(verbose) { 58 writefln("\tNumber of on channel tokens \t= %s.\n", cts.getNumberOfOnChannelTokens); 59 writefln("\ttokens:"); 60 foreach(t; cts.getTokens) 61 writefln("\t\t%s", t); 62 } 63 64 // Specify our entry point 65 auto rootContext = parser.file_input; 66 67 if(!parser.numberOfSyntaxErrors) 68 { 69 // No syntax errors 70 auto base = baseName(filename); 71 auto outputName = base[0..lastIndexOf(base, '.')+1] ~ "d"; 72 if (grammar_version == Version.iba) { 73 auto baseListener = new IBAListener; 74 auto writer = new RuleWriter; 75 if(outputDir) 76 { 77 writer.setOutputPath(outputDir); 78 } 79 writer.setOutputFilename(outputName); 80 baseListener.writer = writer; 81 82 auto walker = new ParseTreeWalker; 83 walker.walk(baseListener, rootContext); 84 } 85 else { 86 auto baseListener = new TTSListener; 87 auto writer = new RuleWriter; 88 if(outputDir) 89 { 90 writer.setOutputPath(outputDir); 91 } 92 writer.setOutputFilename(outputName); 93 baseListener.writer = writer; 94 baseListener.withPropertyName = withPropertyName; 95 baseListener.arguments = arguments; 96 97 auto walker = new ParseTreeWalker; 98 walker.walk(baseListener, rootContext); 99 } 100 } 101 else 102 { 103 writefln("\t%s syntax errors", parser.numberOfSyntaxErrors); 104 parserFailed = true; 105 } 106 } 107 return parserFailed ? 1 : 0; 108 } 109 else { 110 stderr.writeln("Error: missing DSL source"); 111 defaultGetoptPrinter("\nCommand line options", helpInformation.options); 112 return 1; 113 } 114 }