Skip to content
Snippets Groups Projects

pipeline status

RelAST Preprocessor Version 0.2.4

RelAST process

The RelAST preprocessor takes a .relast file as input comprising AST rules and relations. It produces files that afterwards are processed by JastAdd to generated Java code. To use it in your project, build the JAR file running

./gradlew jar

This will produce build/libs/relast.jar. Copy it to your project and extend your build config (preferably Gradle) with the following:

task preprocess(type: JavaExec) {
    group = 'Build'
    main = "-jar"
    args = [
            "libs/relast.jar",
            "./src/main/jastadd/main.relast",
            "--listClass=RefList",
            "--jastAddList=JastAddList",
            "--file"
    ]

    inputs.files file("./src/main/jastadd/main.relast")
    outputs.files file("./src/main/jastadd/mainGen.ast"), file("./src/main/jastadd/mainGen.jadd")
}

Note that you may have to change

  • the directory of relast.jar
  • the .relast file(s) both as argument(s) and input file(s)
  • the output files
  • parameters of RelAST (in this case, the list classes were renamed), the following table shows the supported ones

Supported command-line options

Name Description Default
--ast Print AST (ignores --quiet option) Do not print
--grammarName Directory and file prefix for the generated grammar and jrag created by RelAST. Grammar
--jastAddList Alternative name for List nodes (has to match the option --List of JastAdd or its default List). List
--listClass Set the class name of the nonterminal reference list ArrayList
--quiet Do not output anything on stdout. Normal output
--resolverHelper Set to true to generate means for lazy resolving. false
--serializer Generate a (de-)serializer. One of {jackson, jackson-json-pointer, jackson-manual-references}. No serializer
--useJastAddNames Set to true to use accessor names for relations matching JastAdd naming convention. false

Supported relations

// Directed relations
A.b    -> B;
A.b?   -> B;
A.bs*  -> B;
B      <- A.b  ;
B      <- A.b? ;
B      <- A.bs*;

// Bidirectional relations
A.b   <-> B.a;
A.b   <-> B.a?;
A.b   <-> B.as*;
A.b?  <-> B.a;
A.b?  <-> B.a?;
A.b?  <-> B.as*;
A.bs* <-> B.a;
A.bs* <-> B.a?;
A.bs* <-> B.as*;