|
/**
|
|
*
|
|
* OOAS Compiler (Deprecated)
|
|
*
|
|
* Copyright 2015, Institute for Software Technology, Graz University of
|
|
* Technology. Portions are copyright 2015 by the AIT Austrian Institute
|
|
* of Technology. All rights reserved.
|
|
*
|
|
* SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED.
|
|
*
|
|
* Please notice that this version of the OOAS compiler is considered de-
|
|
* precated. Only the Java version is maintained.
|
|
*
|
|
* Contributors:
|
|
* Willibald Krenn (TU Graz/AIT)
|
|
* Stefan Tiran (TU Graz/AIT)
|
|
*/
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Configuration;
|
|
using Antlr.Runtime;
|
|
using TUG.Mogentes.Codegen;
|
|
|
|
namespace TUG.Mogentes
|
|
{
|
|
[Serializable()]
|
|
public struct ArgosVersion
|
|
{
|
|
public int ParserMajor;
|
|
public int ParserMinor;
|
|
public int ParserRevision;
|
|
|
|
public int GrammarMajor;
|
|
public int GrammarMinor;
|
|
|
|
public override string ToString()
|
|
{
|
|
StringBuilder result = new StringBuilder();
|
|
result.Append(" Version: ");
|
|
result.Append(ParserMajor); result.Append("."); result.Append(String.Format("{0:00}",ParserMinor));
|
|
result.Append(" ("); result.Append(ParserRevision); result.AppendLine(")");
|
|
result.Append(" Grammar-Version: ");
|
|
result.Append(GrammarMajor); result.Append("."); result.Append(String.Format("{0:00}",GrammarMinor));
|
|
return result.ToString();
|
|
}
|
|
}
|
|
|
|
|
|
public abstract class ConfigurationElementCollection<T> : ConfigurationElementCollection
|
|
where T : ConfigurationElement
|
|
{
|
|
protected override ConfigurationElement CreateNewElement()
|
|
{
|
|
return (ConfigurationElement)Activator.CreateInstance(typeof(T));
|
|
}
|
|
|
|
public void Add(T elem)
|
|
{
|
|
BaseAdd(elem);
|
|
}
|
|
|
|
public T this[int index]
|
|
{
|
|
get { return (T)base.BaseGet(index); }
|
|
set
|
|
{
|
|
if (base.BaseGet(index) != null)
|
|
{
|
|
base.BaseRemoveAt(index);
|
|
}
|
|
this.BaseAdd(index, value);
|
|
}
|
|
}
|
|
|
|
public new T this[string key]
|
|
{
|
|
get { return (T)base.BaseGet(key); }
|
|
}
|
|
}
|
|
|
|
public class BackEndConfig : ConfigurationElement
|
|
{
|
|
[ConfigurationProperty("switch", IsRequired = true)]
|
|
public string Switch
|
|
{
|
|
get { return (string)base["switch"]; }
|
|
set { base["switch"] = value; }
|
|
}
|
|
[ConfigurationProperty("file", IsRequired = true)]
|
|
public string File
|
|
{
|
|
get { return (string)base["file"]; }
|
|
set { base["file"] = value; }
|
|
}
|
|
[ConfigurationProperty("class", IsRequired = true)]
|
|
public string Class
|
|
{
|
|
get { return (string)base["class"]; }
|
|
set { base["class"] = value; }
|
|
}
|
|
[ConfigurationProperty("descr", IsRequired = true)]
|
|
public string Descr
|
|
{
|
|
get { return (string)base["descr"]; }
|
|
set { base["descr"] = value; }
|
|
}
|
|
|
|
public BackEndConfig(string aSwitch, string aFile, string aClass, string aDescr)
|
|
: base()
|
|
{
|
|
Switch = aSwitch;
|
|
File = aFile;
|
|
Class = aClass;
|
|
Descr = aDescr;
|
|
}
|
|
|
|
public BackEndConfig(BackEndConfig toCopy)
|
|
{
|
|
Switch = toCopy.Switch;
|
|
File = toCopy.File;
|
|
Class = toCopy.Class;
|
|
Descr = toCopy.Descr;
|
|
}
|
|
|
|
public BackEndConfig() { }
|
|
}
|
|
|
|
public class InstantiatedBackEndConfig : BackEndConfig
|
|
{
|
|
public Type Visitor;
|
|
public System.Reflection.ConstructorInfo Constr;
|
|
|
|
public CreateVisitor GetConstructor()
|
|
{
|
|
return p => (IAstVisitor)Constr.Invoke(new Object[] { p });
|
|
}
|
|
|
|
public InstantiatedBackEndConfig(BackEndConfig toInstantiate)
|
|
: base(toInstantiate)
|
|
{
|
|
if (toInstantiate.File != String.Empty)
|
|
{
|
|
string filename = System.IO.Path.GetFullPath(toInstantiate.File);
|
|
if (!System.IO.File.Exists(filename))
|
|
{
|
|
filename = new Uri(System.Reflection.Assembly.GetExecutingAssembly().Location).LocalPath;
|
|
filename = System.IO.Path.GetDirectoryName(filename) + System.IO.Path.DirectorySeparatorChar + toInstantiate.File;
|
|
if (!System.IO.File.Exists(filename))
|
|
{
|
|
throw new ArgumentException(String.Format("Not found: {0}", toInstantiate.File));
|
|
}
|
|
}
|
|
this.File = filename;
|
|
|
|
|
|
System.Reflection.Assembly backend = System.Reflection.Assembly.LoadFile(File);
|
|
Visitor = backend.GetType(toInstantiate.Class);
|
|
if (Visitor == null)
|
|
throw new ArgumentException(String.Format("Cannot find type {0}", toInstantiate.Class));
|
|
}
|
|
else
|
|
{
|
|
Visitor = System.Reflection.Assembly.GetExecutingAssembly().GetType(toInstantiate.Class);
|
|
if (Visitor == null)
|
|
throw new ArgumentException(String.Format("Cannot find type {0}", toInstantiate.Class));
|
|
}
|
|
|
|
Constr = Visitor.GetConstructor(new Type[] { typeof(ParserState) });
|
|
if (Constr == null)
|
|
throw new ArgumentException(String.Format("Cannot get constructor of type {0}", toInstantiate.Class));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
[ConfigurationCollection(typeof(BackEndConfig))]
|
|
public class BackendSettingsCollection : ConfigurationElementCollection<BackEndConfig>
|
|
{
|
|
protected override object GetElementKey(ConfigurationElement element)
|
|
{
|
|
return ((BackEndConfig)element).Switch;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public class ArgosConfigData : ConfigurationSection
|
|
{
|
|
public ArgosConfigData()
|
|
{
|
|
}
|
|
|
|
[ConfigurationProperty("backends")]
|
|
public BackendSettingsCollection BackendSettings
|
|
{
|
|
get { return (BackendSettingsCollection)this["backends"]; }
|
|
set { this["backends"] = value; }
|
|
}
|
|
}
|
|
|
|
|
|
public class Program
|
|
{
|
|
|
|
public class Options
|
|
{
|
|
public static string searchDepth = "35";
|
|
internal bool quiet = false;
|
|
internal string fileToParse = String.Empty;
|
|
internal string outputToFile = String.Empty;
|
|
internal string namedTypePrefix = String.Empty;
|
|
public static string nameSpace = "as";
|
|
internal List<CreateVisitor> pipeLine = new List<CreateVisitor>();
|
|
}
|
|
|
|
public static List<InstantiatedBackEndConfig> BackEnds = new List<InstantiatedBackEndConfig>();
|
|
public static readonly string BackEndSectionName = "BackEnds";
|
|
|
|
static void CreateSection()
|
|
{
|
|
try
|
|
{
|
|
ArgosConfigData customSection;
|
|
|
|
// Get the current configuration file.
|
|
System.Configuration.Configuration config =
|
|
ConfigurationManager.OpenExeConfiguration(
|
|
ConfigurationUserLevel.None);
|
|
|
|
// Create the section entry
|
|
// in the <configSections> and the
|
|
// related target section in <configuration>.
|
|
if (config.Sections[BackEndSectionName] == null)
|
|
{
|
|
customSection = new ArgosConfigData();
|
|
customSection.BackendSettings.Add(new BackEndConfig("a", String.Empty, "TUG.Mogentes.OoaPrintVisitor", "create psuedo-action system code"));
|
|
customSection.BackendSettings.Add(new BackEndConfig("p", String.Empty, "TUG.Mogentes.Codegen.OoaPrologVisitor", "create prolog code"));
|
|
customSection.BackendSettings.Add(new BackEndConfig("psym", String.Empty, "TUG.Mogentes.Codegen.PrologSymbolic.OoaPrologSymbolicVisitor", "create symbolic prolog code"));
|
|
config.Sections.Add(BackEndSectionName, customSection);
|
|
customSection.SectionInformation.ForceSave = true;
|
|
config.Save(ConfigurationSaveMode.Full);
|
|
}
|
|
}
|
|
catch (ConfigurationErrorsException err)
|
|
{
|
|
Console.WriteLine(err.ToString());
|
|
}
|
|
}
|
|
public static ArgosVersion GetProgramVersion()
|
|
{
|
|
Version ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
|
|
ArgosVersion result;
|
|
result.ParserMajor = ver.Major;
|
|
result.ParserMinor = ver.Minor;
|
|
result.ParserRevision = ver.Revision;
|
|
|
|
result.GrammarMajor = (ver.Build / 100);
|
|
result.GrammarMinor = (ver.Build % 100);
|
|
return result;
|
|
}
|
|
static void displayTitle()
|
|
{
|
|
ArgosVersion ver = Program.GetProgramVersion();
|
|
Console.WriteLine();
|
|
Console.WriteLine(" >> Mogentes OO-Action System Parser <<");
|
|
Console.WriteLine();
|
|
Console.WriteLine(ver.ToString());
|
|
Console.WriteLine();
|
|
}
|
|
|
|
/* display some help screen */
|
|
static void displayHelp()
|
|
{
|
|
string programName = String.Empty;
|
|
programName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString();
|
|
|
|
displayTitle();
|
|
Console.WriteLine("Usage: " + programName + " [options] <oo-actionsystem-file>");
|
|
Console.WriteLine("Options:");
|
|
Console.WriteLine(" -o<name> ... write output to file <name> (overwrites!)");
|
|
Console.WriteLine(" -n<name> ... use namespace <name> (default: as)");
|
|
Console.WriteLine(" -d<depth> ... set max. search depth (default: 35)");
|
|
Console.WriteLine(" -q ... \"quiet\" mode: doesn't print Warnings to console");
|
|
Console.WriteLine();
|
|
foreach (var x in BackEnds)
|
|
{
|
|
Console.WriteLine(String.Format(" -{0} ... {1}", x.Switch, x.Descr));
|
|
}
|
|
}
|
|
|
|
/* fire up the parser */
|
|
static int runAntlrParser(Options options)
|
|
{
|
|
ParserState pState = new ParserState(options);
|
|
int result = ooaParser.FirstPass(pState);
|
|
|
|
|
|
displayTitle();
|
|
|
|
if (result > 0)
|
|
{
|
|
Console.WriteLine("The parser returned {0} errors:", result);
|
|
foreach (var error in pState.listOfParserErrors)
|
|
Console.WriteLine("ERROR ({0}): {1},{2}; {3}", error.file, error.line, error.column, error.message);
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine(" Passed: OoaParser");
|
|
if (options.pipeLine.Count > 0)
|
|
{
|
|
|
|
IAstVisitor visitor = null;
|
|
foreach (var item in options.pipeLine)
|
|
{
|
|
visitor = item(pState);
|
|
pState.ooaSystem.Accept(visitor);
|
|
if (pState.listOfParserErrors.Count > 0)
|
|
{
|
|
Console.WriteLine("The parser ({0}) returned {1} errors:",
|
|
visitor.GetType().Name, pState.listOfParserErrors.Count);
|
|
foreach (var error in pState.listOfParserErrors)
|
|
Console.WriteLine("ERROR ({0}): {1},{2}; {3}",
|
|
error.file, error.line, error.column, error.message);
|
|
return pState.listOfParserErrors.Count;
|
|
}
|
|
else
|
|
{
|
|
Console.Write(" Passed: ");
|
|
Console.WriteLine(visitor.GetType().Name);
|
|
}
|
|
}
|
|
Console.WriteLine();
|
|
Console.WriteLine("File {0} successfully parsed.", pState.filename);
|
|
Console.WriteLine("");
|
|
|
|
if (pState.listOfParserMessages.Count > 0 && !(options.quiet))
|
|
{
|
|
Console.WriteLine(String.Format("Parser returned {0} messages:", pState.listOfParserMessages.Count));
|
|
foreach (var message in pState.listOfParserMessages)
|
|
Console.WriteLine("Message ({0}): {1},{2}; {3}",
|
|
message.file, message.line, message.column, message.message);
|
|
Console.WriteLine();
|
|
Console.WriteLine();
|
|
}
|
|
|
|
if (pState.listOfParserWarnings.Count > 0 && !(options.quiet))
|
|
{
|
|
Console.WriteLine(String.Format("Parser returned {0} warnings:", pState.listOfParserWarnings.Count));
|
|
foreach (var warning in pState.listOfParserWarnings)
|
|
Console.WriteLine("Warning ({0}): {1},{2}; {3}",
|
|
warning.file, warning.line, warning.column, warning.message);
|
|
Console.WriteLine("");
|
|
Console.WriteLine("");
|
|
}
|
|
|
|
if (options.outputToFile != String.Empty)
|
|
{
|
|
Console.WriteLine("Writing output to {0}.", options.outputToFile);
|
|
System.IO.File.WriteAllText(options.outputToFile, visitor.ToString(), System.Text.Encoding.ASCII);
|
|
}
|
|
else
|
|
Console.WriteLine(visitor.ToString());
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine();
|
|
Console.WriteLine("File {0} successfully parsed.", pState.filename);
|
|
Console.WriteLine("");
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
|
|
/* entry point */
|
|
static int Main(string[] args)
|
|
{
|
|
CreateSection();
|
|
Program.Options options = new Program.Options();
|
|
|
|
/*load backends..*/
|
|
ArgosConfigData backends = ConfigurationManager.GetSection(BackEndSectionName) as ArgosConfigData;
|
|
foreach (var x in backends.BackendSettings)
|
|
{
|
|
BackEndConfig cnfg = (BackEndConfig)x;
|
|
//try
|
|
//{
|
|
InstantiatedBackEndConfig icnfg = new InstantiatedBackEndConfig(cnfg);
|
|
BackEnds.Add(icnfg);
|
|
//}
|
|
//catch (ArgumentException)
|
|
//{ }
|
|
}
|
|
|
|
|
|
|
|
if ((args.Length == 0) || (!System.IO.File.Exists(args[args.Length - 1])))
|
|
{
|
|
displayHelp();
|
|
#if DEBUG
|
|
Console.ReadLine();
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
/*do some argument 'parsing'*/
|
|
for (int i = 0; i < args.Length; i++)
|
|
{
|
|
if (args[i].StartsWith("-"))
|
|
ParserOption(args[i], options);
|
|
else
|
|
{
|
|
options.fileToParse = args[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* c# really lacks meta-classes :-((
|
|
* but lambdas are a nice feature too :-)
|
|
*/
|
|
int index = 0;
|
|
options.pipeLine.Insert(index++, p => new OoaSymbolSortVisitor(p));
|
|
options.pipeLine.Insert(index++, p => new OoaReplaceOpaqueVisitor(p));
|
|
options.pipeLine.Insert(index++, p => new OoaTypesVisitor(p));
|
|
options.pipeLine.Insert(index++, p => new OoaResolveExpressionsVisitor(p));
|
|
options.pipeLine.Insert(index++, p => new OoaMethodPureClassifierVisitor(p));
|
|
options.pipeLine.Insert(index++, p => new OoaTypeCheckVisitor(p));
|
|
|
|
if (options.namedTypePrefix != String.Empty)
|
|
{
|
|
options.pipeLine.Insert(index++, p => new OoaTypeRenameVisitor(p));
|
|
}
|
|
|
|
options.pipeLine.Insert(index++, aParser => new OoaRemoveTrivialPrioritizedCompositionVisitor(aParser));
|
|
options.pipeLine.Insert(index++, p => new OoaActionClassifierVisitor(p));
|
|
options.pipeLine.Insert(index++, p => new OoaObjectInstantiationVisitor(p));
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("Parsing {0}.", options.fileToParse);
|
|
int result = runAntlrParser(options);
|
|
#if DEBUG
|
|
Console.ReadLine();
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
private static void ParserOption(string p, Options options)
|
|
{
|
|
string p_lower = p.ToLower();
|
|
|
|
|
|
|
|
if (p_lower.StartsWith("-o"))
|
|
options.outputToFile = p.Remove(0, 2);
|
|
if (p_lower.StartsWith("-t"))
|
|
options.namedTypePrefix = p.Remove(0, 2);
|
|
if (p_lower.StartsWith("-n"))
|
|
{
|
|
|
|
TUG.Mogentes.Program.Options.nameSpace = p.Remove(0, 2);
|
|
}
|
|
if (p_lower.StartsWith("-q"))
|
|
{
|
|
p.Remove(0, 2);
|
|
options.quiet = true;
|
|
}
|
|
|
|
if (p_lower.StartsWith("-d"))
|
|
{
|
|
TUG.Mogentes.Program.Options.searchDepth = p.Remove(0, 2);
|
|
}
|
|
|
|
|
|
else
|
|
foreach (var x in BackEnds)
|
|
{
|
|
if (p_lower.Equals(String.Format("-{0}", x.Switch)))
|
|
{
|
|
options.pipeLine.Add(x.GetConstructor());
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|