diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle index c04195a9cc3a7ea4a799a717910a276f18b8d403..7bfebcfe84f3d6f53a6ceb997eb0108610135e31 100644 --- a/ragconnect.base/build.gradle +++ b/ragconnect.base/build.gradle @@ -17,12 +17,32 @@ buildscript { } dependencies { + implementation project(':relast.preprocessor') implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.6' implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.11.2' runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4' api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' } +def versionFile = 'src/main/resources/ragConnectVersion.properties' +def oldProps = new Properties() + +try { + file(versionFile).withInputStream { stream -> oldProps.load(stream) } + version = oldProps['version'] +} catch (e) { + // this happens, if either the properties file is not present, or cannot be read from + throw new GradleException("File ${versionFile} not found or unreadable. Aborting.", e) +} + +task newVersion() { + doFirst { + def props = new Properties() + props['version'] = value + props.store(file(versionFile).newWriter(), null) + } +} + sourceSets { main { java.srcDir "src/gen/java" diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag index b031267ab8dc8ddcbaf3d5a75e4b8fe5a068f0bb..8195b3a4fe49fbf3de57c5f01e699392fc023a2f 100644 --- a/ragconnect.base/src/main/jastadd/Navigation.jrag +++ b/ragconnect.base/src/main/jastadd/Navigation.jrag @@ -9,31 +9,11 @@ aspect Navigation { eq RagConnect.getChild().ragconnect() = this; eq MRagConnect.getChild().ragconnect() = getRagConnect(); - // --- containedFile (first equation should be in preprocessor) --- - eq Program.getChild().containedFile() = null; + // --- containedFile eq RagConnect.getChild().containedFile() = null; - // --- isTypeComponent (should be in preprocessor) --- - syn boolean Component.isTypeComponent() = false; - eq TypeComponent.isTypeComponent() = true; - - // --- asTypeComponent (should be in preprocessor) --- - syn TypeComponent Component.asTypeComponent() = null; - eq TypeComponent.asTypeComponent() = this; - - // --- isListComponent (should be in preprocessor) --- - syn boolean Component.isListComponent() = false; - eq ListComponent.isListComponent() = true; - - // --- asListComponent (should be in preprocessor) --- - syn ListComponent Component.asListComponent() = null; - eq ListComponent.asListComponent() = this; - - // --- containedFileName (should replace containedFile in preprocessor) --- - inh String ASTNode.containedFileName(); - eq GrammarFile.getChild().containedFileName() = getFileName(); + // --- containedFileName --- eq RagConnect.getChild().containedFileName() = getFileName(); - eq Program.getChild().containedFileName() = null; eq MRagConnect.getChild().containedFileName() = null; // --- isTokenUpdateDefinition --- @@ -71,10 +51,4 @@ aspect Navigation { // --- isDefaultMappingDefinition --- syn boolean MappingDefinition.isDefaultMappingDefinition() = false; eq DefaultMappingDefinition.isDefaultMappingDefinition() = true; - - // --- allTokenComponents --- - coll java.util.Set<TokenComponent> Program.allTokenComponents() [new java.util.HashSet<>()] root Program; - TokenComponent contributes this - to Program.allTokenComponents() - for program(); } diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd index 060d4dfb6c9a87b7601391e1d5adf081c6666f78..88a9b57afc41e43fd9e04e863f7242e7fc88cdfd 100644 --- a/ragconnect.base/src/main/jastadd/backend/Generation.jadd +++ b/ragconnect.base/src/main/jastadd/backend/Generation.jadd @@ -282,6 +282,7 @@ aspect RelationGeneration { right.setType(getSource().containingTypeDecl()); result.setLeft(left); result.setRight(right); + result.addComment(new WhitespaceComment("\n")); return result; } } diff --git a/ragconnect.base/src/main/jastadd/scanner/Header.flex b/ragconnect.base/src/main/jastadd/scanner/Header.flex index 53f20ea9b3ea615da3c90ac3120ddea033afc4c0..f289a7e89438a572e3dd936548355cf600d3b8bd 100644 --- a/ragconnect.base/src/main/jastadd/scanner/Header.flex +++ b/ragconnect.base/src/main/jastadd/scanner/Header.flex @@ -13,5 +13,8 @@ import org.jastadd.ragconnect.parser.RagConnectParser.Terminals; %yylexthrow beaver.Scanner.Exception %scanerror RagConnectScanner.ScannerError +%x COMMENT +%s DECLARATION + %line %column diff --git a/ragconnect.base/src/main/jastadd/scanner/Keywords.flex b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex index 3f546823fd8e034f821c8e867d8777ef697effdd..feb161450bd723ef7811ba6759e1d74b5fd9cffd 100644 --- a/ragconnect.base/src/main/jastadd/scanner/Keywords.flex +++ b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex @@ -1,5 +1,5 @@ -"read" { return sym(Terminals.READ); } -"write" { return sym(Terminals.WRITE); } +"read" { yybegin(DECLARATION); return sym(Terminals.READ); } +"write" { yybegin(DECLARATION); return sym(Terminals.WRITE); } "using" { return sym(Terminals.USING); } "canDependOn" { return sym(Terminals.CAN_DEPEND_ON); } "maps" { return sym(Terminals.MAPS); } diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java index e23d4bdd168c1b5f40fb95c7cc9a2a5f02c43cdf..ec23141f3adfe2d166c465e7532155c1dad79ef6 100644 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java +++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java @@ -1,90 +1,57 @@ package org.jastadd.ragconnect.compiler; import beaver.Parser; -import org.jastadd.ragconnect.compiler.options.CommandLine; -import org.jastadd.ragconnect.compiler.options.FlagOption; -import org.jastadd.ragconnect.compiler.options.Option; -import org.jastadd.ragconnect.compiler.options.StringOption; +import org.jastadd.option.BooleanOption; +import org.jastadd.option.ValueOption; +import org.jastadd.relast.compiler.AbstractCompiler; +import org.jastadd.relast.compiler.CompilerException; import org.jastadd.ragconnect.ast.*; import org.jastadd.ragconnect.parser.RagConnectParser; import org.jastadd.ragconnect.scanner.RagConnectScanner; import java.io.*; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; +import java.util.Collection; +import java.util.MissingResourceException; +import java.util.ResourceBundle; -public class Compiler { +public class Compiler extends AbstractCompiler { - private StringOption optionOutputDir; - private StringOption optionInputGrammar; - private StringOption optionRootNode; - private StringOption optionInputRagConnect; - private FlagOption optionHelp; - private FlagOption optionVerbose; - private FlagOption optionLogReads; - private FlagOption optionLogWrites; - - private ArrayList<Option<?>> options; - private CommandLine commandLine; +// private ValueOption optionOutputDir; + private ValueOption optionRootNode; + private BooleanOption optionVerbose; + private BooleanOption optionLogReads; + private BooleanOption optionLogWrites; public Compiler() { - options = new ArrayList<>(); - addOptions(); - } - - public void run(String[] args) throws CommandLine.CommandLineException, CompilerException { - System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); - System.setProperty("mustache.debug", "true"); - options = new ArrayList<>(); - addOptions(); - commandLine = new CommandLine(options); - commandLine.parse(args); - - if (optionHelp.isSet()) { - printUsage(); - return; - } - - if (optionVerbose.isSet()) { - try { - run(); - } catch (CompilerException e) { - e.printStackTrace(); - throw e; - } - } else { - run(); - } + super("ragconnect", true); } - private void run() throws CompilerException { - String outputDir; - if (optionOutputDir.isSet()) { - outputDir = optionOutputDir.getValue(); - } else { - outputDir = "gen"; - System.out.println("No output output dir is set. Assuming '" + outputDir + "'."); + @Override + protected int compile() throws CompilerException { + if (getConfiguration().shouldPrintVersion()) { + System.out.println(readVersion()); + return 0; } - try { - Files.createDirectories(Paths.get(outputDir)); - } catch (IOException e) { - throw new CompilerException("Error creating output dir " + outputDir, e); + if (getConfiguration().shouldPrintHelp()) { + getConfiguration().printHelp(System.out); + return 0; } - printMessage("Running RagConnect Preprocessor"); + printMessage("Running RagConnect " + readVersion()); - if (anyRequiredOptionIsUnset()) { - throw new CompilerException("Aborting due to missing values for required options."); + if (!getConfiguration().outputDir().exists()) { + try { + Files.createDirectories(getConfiguration().outputDir().toPath()); + } catch (IOException e) { + throw new CompilerException("Error creating output dir " + getConfiguration().outputDir(), e); + } } - List<String> otherArgs = commandLine.getArguments(); - if (!otherArgs.isEmpty()) { - printMessage("Superfluous arguments will be ignored: " + otherArgs); - } - RagConnect ragConnect = parseProgram(optionInputGrammar.getValue(), optionInputRagConnect.getValue()); + RagConnect ragConnect = parseProgram(getConfiguration().getFiles()); if (!ragConnect.errors().isEmpty()) { System.err.println("Errors:"); @@ -103,114 +70,166 @@ public class Compiler { throw new CompilerException("Could not open " + mqttHandlerFileName); } Files.copy(inputStream, - Paths.get(outputDir, mqttHandlerFileName), + getConfiguration().outputDir().toPath().resolve(mqttHandlerFileName), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new CompilerException("Could not copy " + mqttHandlerFileName, e); } - writeToFile(outputDir + "/Grammar.relast", ragConnect.getProgram().generateAbstractGrammar()); - writeToFile(outputDir + "/RagConnect.jadd", ragConnect.generateAspect(optionRootNode.getValue())); - } - - private boolean anyRequiredOptionIsUnset() { - boolean foundError = false; - for (Option<?> option : options) { - if (option.hasArgument() == Option.HasArgument.YES && !option.isSet()) { - System.err.println("Option '" + option.getName() + - "' (" + option.getDescription() + ") is required but unset!"); - foundError = true; - } + for (GrammarFile grammarFile : ragConnect.getProgram().getGrammarFileList()) { + Path outputFile = getConfiguration().outputDir().toPath().resolve(grammarFile.getFileName()); + writeToFile(outputFile, grammarFile.generateAbstractGrammar()); } - return foundError; + writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.jadd"), ragConnect.generateAspect(optionRootNode.value())); + return 0; } - public static void main(String[] args) { + System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); + System.setProperty("mustache.debug", "true"); try { new Compiler().run(args); - } catch (CommandLine.CommandLineException | CompilerException e) { + } catch (CompilerException e) { System.err.println(e.getMessage()); System.exit(-1); } } + /** + * Reads the version string. + * + * The version string is read from the property file + * src/main/resources/Version.properties. This + * file should be generated during the build process. If it is missing + * then there is some problem in the build script. + * + * @author Jesper Öqvist <jesper.oqvist@cs.lth.se> + * @return the read version string, or <code>version ?</code> + */ + private String readVersion() { + try { + ResourceBundle resources = ResourceBundle.getBundle("ragConnectVersion"); + return resources.getString("version"); + } catch (MissingResourceException e) { + return "version ?"; + } + } + private void printMessage(String message) { System.out.println(message); } - private void writeToFile(String filename, String str) throws CompilerException { - try { - PrintWriter writer = new PrintWriter(filename); - writer.print(str); - writer.close(); + private void writeToFile(Path path, String str) throws CompilerException { + try (BufferedWriter writer = Files.newBufferedWriter(path)) { + writer.append(str); } catch (Exception e) { - throw new CompilerException("Could not write to file " + filename, e); + throw new CompilerException("Could not write to file " + path.toAbsolutePath(), e); } } - private void addOptions() { - optionOutputDir = addOption(new StringOption("outputDir", "target directory for the generated files.")); - optionInputGrammar = addOption(new StringOption("inputGrammar", "base grammar.")); - optionRootNode = addOption(new StringOption("rootNode", "root node in the base grammar.")); - optionInputRagConnect = addOption(new StringOption("inputRagConnect", "connect definition file.")); - optionHelp = addOption(new FlagOption("help", "Print usage and exit.")); - optionVerbose = addOption(new FlagOption("verbose", "Print more messages while compiling.")); - optionLogReads = addOption(new FlagOption("logReads", "Enable logging for every read.")); - optionLogWrites = addOption(new FlagOption("logWrites", "Enable logging for every write.")); + protected void initOptions() { + super.initOptions(); + optionRootNode = addOption( + new ValueOption("rootNode", "root node in the base grammar.") + .acceptAnyValue() + .needsValue(true)); + optionVerbose = addOption( + new BooleanOption("verbose", "Print more messages while compiling.") + .defaultValue(false)); + optionLogReads = addOption( + new BooleanOption("logReads", "Enable logging for every read.") + .defaultValue(false)); + optionLogWrites = addOption( + new BooleanOption("logWrites", "Enable logging for every write.") + .defaultValue(false)); } - private <OptionType extends Option<?>> OptionType addOption(OptionType option) { - options.add(option); - return option; - } - - private RagConnect parseProgram(String inputGrammarFileName, String inputRagConnectFileName) throws CompilerException { + private RagConnect parseProgram(Collection<String> files) throws CompilerException { Program program = new Program(); - RagConnect ros2Rag; - GrammarFile inputGrammar; - try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputGrammarFileName))) { + RagConnect ragConnect = new RagConnect(); + ragConnect.setProgram(program); + + GrammarFile ragConnectGrammarPart = new GrammarFile(); + ragConnectGrammarPart.setFileName("RagConnect.relast"); + program.addGrammarFile(ragConnectGrammarPart); + + for (String filename : files) { + String extension = filename.substring(filename.lastIndexOf('.') + 1); + switch (extension) { + case "ast": + case "relast": + // processGrammar + parseGrammar(program, filename); + break; + case "connect": + // process ragConnect + RagConnect parsedRagConnect = parseRagConnect(program, filename); + mergeRagConnectDefinitions(ragConnect, parsedRagConnect); + break; + default: + throw new CompilerException("Unknown file extension in " + filename); + } + } + ragConnect.treeResolveAll(); + ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration); + ASTNode.loggingEnabledForReads = optionLogReads.value(); + ASTNode.loggingEnabledForWrites = optionLogWrites.value(); + return ragConnect; + } + + private void parseGrammar(Program program, String filename) throws CompilerException { + try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) { RagConnectScanner scanner = new RagConnectScanner(reader); RagConnectParser parser = new RagConnectParser(); - inputGrammar = (GrammarFile) parser.parse(scanner); - if (optionVerbose.isSet()) { - inputGrammar.dumpTree(System.out); + GrammarFile grammarFile = (GrammarFile) parser.parse(scanner); + if (optionVerbose.value()) { + grammarFile.dumpTree(System.out); } - program.addGrammarFile(inputGrammar); - inputGrammar.treeResolveAll(); - inputGrammar.setFileName(inputGrammarFileName); + program.addGrammarFile(grammarFile); + grammarFile.treeResolveAll(); + grammarFile.setFileName(toBaseName(filename)); } catch (IOException | Parser.Exception e) { - throw new CompilerException("Could not parse grammar file " + inputGrammarFileName, e); + throw new CompilerException("Could not parse grammar file " + filename, e); } + } - try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputRagConnectFileName))) { + private RagConnect parseRagConnect(Program program, String filename) throws CompilerException { + try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) { RagConnectScanner scanner = new RagConnectScanner(reader); RagConnectParser parser = new RagConnectParser(); - ros2Rag = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect); - ros2Rag.setProgram(program); - ros2Rag.setFileName(inputRagConnectFileName); + RagConnect ragConnect = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect); + ragConnect.setProgram(program); + ragConnect.setFileName(toBaseName(filename)); + return ragConnect; } catch (IOException | Parser.Exception e) { - throw new CompilerException("Could not parse ros2rag file " + inputRagConnectFileName, e); + throw new CompilerException("Could not parse connect file " + filename, e); } - ros2Rag.treeResolveAll(); - ros2Rag.additionalRelations().forEach(inputGrammar::addDeclaration); - ASTNode.loggingEnabledForReads = optionLogReads.isSet(); - ASTNode.loggingEnabledForWrites = optionLogWrites.isSet(); - return ros2Rag; } - protected void printUsage() { - System.out.println("Usage: java -jar ros2rag.jar [--option1] [--option2=value] ... <filename1> <filename2> ... "); - System.out.println("Options:"); - System.out.print(commandLine.printOptionHelp()); + /** + * Extracts the basename of the given file, with file extension + * @param filename the given filename + * @return the basename + */ + private String toBaseName(String filename) { + return new File(filename).getName(); } - public static class CompilerException extends Exception { - CompilerException(String message) { - super(message); + private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) { + for (UpdateDefinition updateDefinition : ragConnectToIntegrate.getUpdateDefinitionList()) { + ragConnect.addUpdateDefinition(updateDefinition); } - CompilerException(String message, Throwable cause) { - super(message, cause); + for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) { + ragConnect.addMappingDefinition(mappingDefinition); + } + for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) { + ragConnect.addDependencyDefinition(dependencyDefinition); } } + +// protected void printUsage() { +// System.out.println("Usage: java -jar ragconnect.jar [--option1] [--option2=value] ... <filename1> <filename2> ... "); +// System.out.println("Options:"); +// System.out.print(commandLine.printOptionHelp()); +// } } diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/CommandLine.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/CommandLine.java deleted file mode 100644 index dc29ba032e1a7cdc234a9fdac60064205b5ca5ea..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/CommandLine.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.jastadd.ragconnect.compiler.options; - -import java.util.*; - -public class CommandLine { - private final Collection<Option<?>> options; - private final Map<String, Option<?>> mapping; - private final List<String> arguments; - - public CommandLine(Collection<Option<?>> options) { - this.options = options; - this.mapping = new HashMap<>(); - for (Option<?> option : options) { - mapping.put(option.getName(), option); - } - this.arguments = new ArrayList<>(); - } - - public void parse(String[] args) throws CommandLineException { - int i = 0; - while (i < args.length) { - if (args[i].startsWith(Option.PREFIX)) { - int argumentIndex = args[i].indexOf("="); - String name; - String argument = null; - if (argumentIndex > 0) { - name = args[i].substring(2, argumentIndex); - argument = args[i].substring(argumentIndex + 1); - } else { - name = args[i].substring(2); - } - Option<?> option = mapping.get(name); - if (option == null) { - throw new CommandLineException("Option " + Option.PREFIX + name + " not found"); - } - match(option, argument); - } else { - arguments.add(args[i]); - } - i++; - } - } - - public void match(Option<?> option, String argument) throws CommandLineException { - try { - switch (option.hasArgument()) { - case NO: - if (argument == null) { - option.match(null); - } else { - throw new CommandLineException("Option " + option + " is not allowed to have an argument"); - } - break; - case OPTIONAL: - option.match(argument); - break; - case YES: - if (argument != null) { - option.match(argument); - } else { - throw new CommandLineException("Option " + option + " requires an argument"); - } - break; - } - } catch (Option.IllegalMatchException e) { - throw new CommandLineException("Invalid value for option " + option + ": " + e.getMessage()); - } - } - - public List<String> getArguments() { - return arguments; - } - - public String printOptionHelp() { - StringBuilder sb = new StringBuilder(); - int longestOption = 0; - for (Option<?> option : options) { - if (longestOption < option.getName().length()) { - longestOption = option.getName().length(); - } - } - for (Option<?> option : new TreeSet<>(options)) { - String s = String.format(" %s%-" + (longestOption + 6) + "s %s%n", - Option.PREFIX, option.getName(), option.getDescription()); - sb.append(s); - } - return sb.toString(); - } - - public static class CommandLineException extends Exception { - private static final long serialVersionUID = 1L; - - public CommandLineException(String message) { - super(message); - } - } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/EnumOption.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/EnumOption.java deleted file mode 100644 index a5278d36a39d12e21b2015cca2659321ced5117f..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/EnumOption.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jastadd.ragconnect.compiler.options; - -import java.util.Collection; -import java.util.TreeSet; - -public class EnumOption extends Option<String> { - private final TreeSet<String> allowedValues; - private final String defaultValue; - private String value; - private boolean isSet; - - public EnumOption(String name, String description, Collection<String> allowedValues, String defaultValue) { - super(name, description); - this.allowedValues = new TreeSet<>(allowedValues); - this.defaultValue = defaultValue; - this.value = defaultValue; - this.isSet = false; - } - - public boolean addAllowedValue(String allowedValue) { - return allowedValues.add(allowedValue); - } - - @Override - public String getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.OPTIONAL; - } - - @Override - public void match(String argument) throws IllegalMatchException { - if (argument == null) { - isSet = true; - value = defaultValue; - } else if (allowedValues.contains(argument)) { - isSet = true; - value = argument; - } else { - throw new IllegalMatchException(argument - + " is not allowed, allowed values are " + allowedValues); - } - } - - @Override - public boolean isSet() { - return isSet; - } - - @Override - public String getDescription() { - String allowedValuesStr = allowedValues.toString(); - allowedValuesStr = allowedValuesStr.substring(1); - allowedValuesStr = allowedValuesStr.substring(0, allowedValuesStr.length() - 1); - return super.getDescription() + " (allowed values: " + allowedValuesStr + ")"; - } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/FlagOption.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/FlagOption.java deleted file mode 100644 index c16e20dc2075ad1a472bbc483e312561f9cd1d1a..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/FlagOption.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.jastadd.ragconnect.compiler.options; - -public class FlagOption extends Option<Boolean> { - private boolean value; - - public FlagOption(String name, String description) { - super(name, description); - value = false; - } - - @Override - public Boolean getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.NO; - } - - @Override - public void match(String string) throws IllegalMatchException { - value = true; - } - - @Override - public boolean isSet() { - return getValue(); - } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/Option.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/Option.java deleted file mode 100644 index cc1469cfa49e8b85ea95dda0de5509e91027b315..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/Option.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jastadd.ragconnect.compiler.options; - -abstract public class Option<ValueType> implements Comparable<Option<?>> { - public final static String PREFIX = "--"; - private final String name; - private final String description; - - public Option(String name, String description) { - this.name = name; - this.description = description; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - @Override - public int compareTo(Option<?> o) { - return name.compareTo(o.name); - } - - @Override - public boolean equals(Object other) { - if (other instanceof Option) { - return compareTo((Option<?>) other) == 0; - } - return false; - } - - @Override - public String toString() { - return PREFIX + name; - } - - abstract public boolean isSet(); - - abstract public ValueType getValue(); - - abstract public HasArgument hasArgument(); - - abstract public void match(String input) throws IllegalMatchException; - - public enum HasArgument { - NO, - OPTIONAL, - YES - } - - public static class IllegalMatchException extends Exception { - private static final long serialVersionUID = 1L; - - public IllegalMatchException(String message) { - super(message); - } - } -} diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/StringOption.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/StringOption.java deleted file mode 100644 index 51ee57a5c999f32822b249d5caf48a2f4de8ce7d..0000000000000000000000000000000000000000 --- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/StringOption.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jastadd.ragconnect.compiler.options; - -public class StringOption extends Option<String> { - private String value; - private boolean isSet; - - public StringOption(String name, String description) { - this(name, description, ""); - } - - public StringOption(String name, String description, String defaultValue) { - super(name, description); - value = defaultValue; - isSet = false; - } - - @Override - public String getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.YES; - } - - @Override - public void match(String value) { - this.value = value; - isSet = true; - } - - @Override - public boolean isSet() { - return isSet; - } -} diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties new file mode 100644 index 0000000000000000000000000000000000000000..8ec441610d66cd3f793075302676eb132eea35c3 --- /dev/null +++ b/ragconnect.base/src/main/resources/ragConnectVersion.properties @@ -0,0 +1,2 @@ +#Wed Jul 29 16:29:05 CEST 2020 +version=0.2.0 diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle index ab534e4e47548c416e99769616d85f3de190ab70..d0a6997e48aac4caa7b4c5c0c249210c7276271d 100644 --- a/ragconnect.tests/build.gradle +++ b/ragconnect.tests/build.gradle @@ -67,16 +67,16 @@ sourceSets { // --- Test: Example --- task preprocessExampleTest(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ragconnect/example/Grammar.relast', + delete 'src/test/02-after-ragconnect/example/Test.relast', 'src/test/02-after-ragconnect/example/MqttHandler.java', 'src/test/02-after-ragconnect/example/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--outputDir=src/test/02-after-ragconnect/example', - '--inputGrammar=src/test/01-input/example/Test.relast', - '--inputRagConnect=src/test/01-input/example/Test.ragconnect', + args '--o=src/test/02-after-ragconnect/example', + 'src/test/01-input/example/Test.relast', + 'src/test/01-input/example/Test.connect', '--rootNode=Model', '--logReads', '--logWrites' } @@ -84,7 +84,8 @@ task preprocessExampleTest(type: JavaExec, group: 'verification') { task compileExampleTest(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/example/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/example/Test.relast', + 'src/test/02-after-ragconnect/example/RagConnect.relast' grammarName = 'src/test/03-after-relast/example/example' packageName = 'example.ast' moreInputFiles 'src/test/01-input/example/Test.jadd', @@ -98,16 +99,16 @@ compileExampleTest.dependsOn preprocessExampleTest // --- Test: default-only-read --- task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ragconnect/defaultOnlyRead/Grammar.relast', + delete 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast', 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.java', 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--outputDir=src/test/02-after-ragconnect/defaultOnlyRead', - '--inputGrammar=src/test/01-input/defaultOnlyRead/Test.relast', - '--inputRagConnect=src/test/01-input/defaultOnlyRead/Test.ragconnect', + args '--o=src/test/02-after-ragconnect/defaultOnlyRead', + 'src/test/01-input/defaultOnlyRead/Test.relast', + 'src/test/01-input/defaultOnlyRead/Test.connect', '--rootNode=A', '--verbose' } @@ -115,7 +116,8 @@ task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') { task compileDefaultOnlyReadTest(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/defaultOnlyRead/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast', + 'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.relast' grammarName = 'src/test/03-after-relast/defaultOnlyRead/defaultOnlyRead' packageName = 'defaultOnlyRead.ast' moreInputFiles 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.jadd', @@ -128,16 +130,16 @@ compileDefaultOnlyReadTest.dependsOn preprocessDefaultOnlyReadTest // --- Test: default-only-write --- task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ragconnect/defaultOnlyWrite/Grammar.relast', + delete 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast', 'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.java', 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--outputDir=src/test/02-after-ragconnect/defaultOnlyWrite', - '--inputGrammar=src/test/01-input/defaultOnlyWrite/Test.relast', - '--inputRagConnect=src/test/01-input/defaultOnlyWrite/Test.ragconnect', + args '--o=src/test/02-after-ragconnect/defaultOnlyWrite', + 'src/test/01-input/defaultOnlyWrite/Test.relast', + 'src/test/01-input/defaultOnlyWrite/Test.connect', '--rootNode=A', '--verbose' } @@ -145,7 +147,8 @@ task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') { task compileDefaultOnlyWriteTest(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/defaultOnlyWrite/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast', + 'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.relast' grammarName = 'src/test/03-after-relast/defaultOnlyWrite/defaultOnlyWrite' packageName = 'defaultOnlyWrite.ast' moreInputFiles 'src/test/01-input/defaultOnlyWrite/Test.jadd', @@ -159,16 +162,16 @@ compileDefaultOnlyWriteTest.dependsOn preprocessDefaultOnlyWriteTest // --- Test: read1write2 --- task preprocessRead1Write2Test(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ragconnect/read1write2/Grammar.relast', + delete 'src/test/02-after-ragconnect/read1write2/Test.relast', 'src/test/02-after-ragconnect/read1write2/MqttHandler.java', 'src/test/02-after-ragconnect/read1write2/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--outputDir=src/test/02-after-ragconnect/read1write2', - '--inputGrammar=src/test/01-input/read1write2/Test.relast', - '--inputRagConnect=src/test/01-input/read1write2/Test.ragconnect', + args '--o=src/test/02-after-ragconnect/read1write2', + 'src/test/01-input/read1write2/Test.relast', + 'src/test/01-input/read1write2/Test.connect', '--rootNode=A', '--logReads', '--logWrites' } @@ -176,7 +179,8 @@ task preprocessRead1Write2Test(type: JavaExec, group: 'verification') { task compileRead1Write2Test(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/read1write2/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/read1write2/Test.relast', + 'src/test/02-after-ragconnect/read1write2/RagConnect.relast' grammarName = 'src/test/03-after-relast/read1write2/read1write2' packageName = 'read1write2.ast' moreInputFiles 'src/test/01-input/read1write2/Test.jadd', @@ -190,16 +194,16 @@ compileRead1Write2Test.dependsOn preprocessRead1Write2Test // --- Test: read2write1 --- task preprocessRead2Write1Test(type: JavaExec, group: 'verification') { doFirst { - delete 'src/test/02-after-ragconnect/read2write1/Grammar.relast', + delete 'src/test/02-after-ragconnect/read2write1/Test.relast', 'src/test/02-after-ragconnect/read2write1/MqttHandler.java', 'src/test/02-after-ragconnect/read2write1/RagConnect.jadd' } classpath = sourceSets.main.runtimeClasspath main = 'org.jastadd.ragconnect.compiler.Compiler' - args '--outputDir=src/test/02-after-ragconnect/read2write1', - '--inputGrammar=src/test/01-input/read2write1/Test.relast', - '--inputRagConnect=src/test/01-input/read2write1/Test.ragconnect', + args '--o=src/test/02-after-ragconnect/read2write1', + 'src/test/01-input/read2write1/Test.relast', + 'src/test/01-input/read2write1/Test.connect', '--rootNode=A', '--verbose', '--logReads', '--logWrites' } @@ -207,7 +211,8 @@ task preprocessRead2Write1Test(type: JavaExec, group: 'verification') { task compileRead2Write1Test(type: RelastTest) { useJastAddNames = true jastAddList = 'JastAddList' - relastFiles 'src/test/02-after-ragconnect/read2write1/Grammar.relast' + relastFiles 'src/test/02-after-ragconnect/read2write1/Test.relast', + 'src/test/02-after-ragconnect/read2write1/RagConnect.relast' grammarName = 'src/test/03-after-relast/read2write1/read2write1' packageName = 'read2write1.ast' moreInputFiles 'src/test/01-input/read2write1/Test.jadd', diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.ragconnect b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect similarity index 100% rename from ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.ragconnect rename to ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.ragconnect b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect similarity index 100% rename from ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.ragconnect rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.ragconnect b/ragconnect.tests/src/test/01-input/errors/Errors.connect similarity index 100% rename from ragconnect.tests/src/test/01-input/errors/Errors.ragconnect rename to ragconnect.tests/src/test/01-input/errors/Errors.connect diff --git a/ragconnect.tests/src/test/01-input/example/Test.ragconnect b/ragconnect.tests/src/test/01-input/example/Test.connect similarity index 100% rename from ragconnect.tests/src/test/01-input/example/Test.ragconnect rename to ragconnect.tests/src/test/01-input/example/Test.connect diff --git a/ragconnect.tests/src/test/01-input/example/config.json b/ragconnect.tests/src/test/01-input/example/config.json new file mode 100644 index 0000000000000000000000000000000000000000..02843152a51197a04bce4e8e54ad4ec0f703eca5 --- /dev/null +++ b/ragconnect.tests/src/test/01-input/example/config.json @@ -0,0 +1,9 @@ +{ + "joints": [ + {"name": "Joint1", "topic": "robot/arm/joint1"}, + {"name": "Joint2", "topic": "robot/arm/joint2"}, + {"name": "EndEffector", "topic": "-", "isEndEffector": true} + ], + "robotConfigTopic": "robot/config", + "dataConfigTopic": "-" +} diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.ragconnect b/ragconnect.tests/src/test/01-input/read1write2/Test.connect similarity index 100% rename from ragconnect.tests/src/test/01-input/read1write2/Test.ragconnect rename to ragconnect.tests/src/test/01-input/read1write2/Test.connect diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.ragconnect b/ragconnect.tests/src/test/01-input/read2write1/Test.connect similarity index 100% rename from ragconnect.tests/src/test/01-input/read2write1/Test.ragconnect rename to ragconnect.tests/src/test/01-input/read2write1/Test.connect diff --git a/relast.preprocessor b/relast.preprocessor index 54af6737685fab0be452f446b70b9842aba89e42..79d237fda220364ffebf77dc7de0a7b29635e360 160000 --- a/relast.preprocessor +++ b/relast.preprocessor @@ -1 +1 @@ -Subproject commit 54af6737685fab0be452f446b70b9842aba89e42 +Subproject commit 79d237fda220364ffebf77dc7de0a7b29635e360 diff --git a/ros2rag.goal/build.gradle b/ros2rag.goal/build.gradle index d325acd2ebfef7b7ed1655b19e5f05db9b910395..93d8a8ae2f580d1e944216aeb8d70166532f3301 100644 --- a/ros2rag.goal/build.gradle +++ b/ros2rag.goal/build.gradle @@ -42,9 +42,9 @@ task ragConnect(type: JavaExec) { args([ '--verbose', - '--outputDir=src/gen/jastadd', - '--inputGrammar=src/main/jastadd/GoalModel.relast', - '--inputRagConnect=src/main/jastadd/GoalModel.connect', + '--o=src/gen/jastadd', + 'src/main/jastadd/GoalModel.relast', + 'src/main/jastadd/GoalModel.connect', '--rootNode=GoalModel' ]) } diff --git a/ros2rag.receiverstub/build.gradle b/ros2rag.receiverstub/build.gradle index 73d331a982f1c3229058eb7cc71b1b893a38970c..02b49e36590bc01a544bcc9a7fc839109d32d817 100644 --- a/ros2rag.receiverstub/build.gradle +++ b/ros2rag.receiverstub/build.gradle @@ -36,10 +36,9 @@ task ragConnect(type: JavaExec) { main = 'org.jastadd.ragconnect.compiler.Compiler' args([ - '--verbose', - '--outputDir=src/gen/jastadd', - '--inputGrammar=src/main/jastadd/Receiver.ast', - '--inputRagConnect=src/main/jastadd/Receiver.connect', + '--o=src/gen/jastadd', + 'src/main/jastadd/Receiver.ast', + 'src/main/jastadd/Receiver.connect', '--rootNode=Receiver' ]) } diff --git a/ros2rag.safety/build.gradle b/ros2rag.safety/build.gradle index f6578202df8290088369a7653a8bbb7b948443c0..ba58d744b35eabab57cc7bf5abe0936cb646bfbc 100644 --- a/ros2rag.safety/build.gradle +++ b/ros2rag.safety/build.gradle @@ -32,19 +32,18 @@ dependencies { // Input files for relast def relastFiles = ["src/gen/jastadd/Grammar.relast"] -// phases: Ros2Rag -> RelAst -> JastAdd -// phase: Ros2Rag -task ros2rag(type: JavaExec) { +// phases: ragConnect -> RelAst -> JastAdd +// phase: ragConnect +task ragConnect(type: JavaExec) { classpath = configurations.baseRuntimeClasspath group = 'Build' main = 'org.jastadd.ragconnect.compiler.Compiler' args([ - '--verbose', - '--outputDir=src/gen/jastadd', - '--inputGrammar=src/main/jastadd/SafetyModel.relast', - '--inputRagConnect=src/main/jastadd/SafetyModel.connect', + '--o=src/gen/jastadd', + 'src/main/jastadd/SafetyModel.relast', + 'src/main/jastadd/SafetyModel.connect', '--rootNode=Model' ]) } @@ -119,4 +118,4 @@ jastadd { // Workflow configuration for phases generateAst.dependsOn relastToJastAdd -relastToJastAdd.dependsOn ros2rag +relastToJastAdd.dependsOn ragConnect diff --git a/ros2rag.senderstub/build.gradle b/ros2rag.senderstub/build.gradle index 4996963f3cd48d81554a3ee91a860d2b88f18751..1497d02abfcb5882708dd12497686c893976d772 100644 --- a/ros2rag.senderstub/build.gradle +++ b/ros2rag.senderstub/build.gradle @@ -36,10 +36,9 @@ task ragConnect(type: JavaExec) { main = 'org.jastadd.ragconnect.compiler.Compiler' args([ - '--verbose', - '--outputDir=src/gen/jastadd', - '--inputGrammar=src/main/jastadd/Sender.ast', - '--inputRagConnect=src/main/jastadd/Sender.connect', + '--o=src/gen/jastadd', + 'src/main/jastadd/Sender.ast', + 'src/main/jastadd/Sender.connect', '--rootNode=Sender' ]) }