From 2f8c46dcba0162e2dc91ba06238aea08bd170fde Mon Sep 17 00:00:00 2001
From: Tom Wiseman <twiseman@broadinstitute.org>
Date: Fri, 29 Mar 2024 09:32:45 -0400
Subject: [PATCH] [WX-1460] WDL 1.1 Struct Literal Parsing (#7391)

Co-authored-by: Janet Gainer-Dewar <jdewar@broadinstitute.org>
---
 .../standardTestCases/struct_literal.test     |   12 +
 .../struct_literal/struct_literal.wdl         |   68 +
 .../draft3/elements/ExpressionElement.scala   |    2 +
 .../java/wdl/biscayne/parser/WdlParser.java   | 1944 +++++++++--------
 .../biscayne/src/main/resources/CHANGELOG.txt |   13 +-
 .../biscayne/src/main/resources/grammar.hgr   |    1 +
 .../BiscayneExpressionValueConsumers.scala    |   10 +
 .../expression/consumed/consumed.scala        |    1 +
 .../files/BiscayneFileEvaluators.scala        |   43 +-
 .../linking/expression/files/files.scala      |    3 +-
 .../types/BiscayneTypeEvaluators.scala        |   12 +
 .../linking/expression/types/types.scala      |    1 +
 .../values/BiscayneValueEvaluators.scala      |   27 +-
 .../linking/expression/values/values.scala    |    3 +-
 .../src/test/cases/struct_literal.wdl         |   39 +
 .../transforms/biscayne/Ast2WdlomSpec.scala   |   11 +-
 .../ast2wdlom/WdlFileToWdlomSpec.scala        |  106 +-
 ...BiscayneExpressionValueConsumersSpec.scala |    9 +
 .../files/BiscayneFileEvaluatorSpec.scala     |   11 +
 .../types/BiscayneTypeEvaluatorSpec.scala     |   10 +
 .../values/BiscayneValueEvaluatorSpec.scala   |   12 +-
 .../java/wdl/cascades/parser/WdlParser.java   | 1942 ++++++++--------
 .../cascades/src/main/resources/CHANGELOG.txt |   13 +-
 .../cascades/src/main/resources/grammar.hgr   |    1 +
 .../CascadesExpressionValueConsumers.scala    |   10 +
 .../expression/consumed/consumed.scala        |    1 +
 .../files/CascadesFileEvaluators.scala        |   42 +-
 .../linking/expression/files/files.scala      |    2 +
 .../types/CascadesTypeEvaluators.scala        |   12 +
 .../linking/expression/types/types.scala      |    1 +
 .../values/CascadesValueEvaluators.scala      |   27 +-
 .../linking/expression/values/values.scala    |    2 +
 .../src/test/cases/struct_literal.wdl         |   39 +
 .../transforms/cascades/Ast2WdlomSpec.scala   |   12 +-
 .../ast2wdlom/WdlFileToWdlomSpec.scala        |  100 +-
 ...CascadesExpressionValueConsumersSpec.scala |    9 +
 .../files/CascadesFileEvaluatorSpec.scala     |   11 +
 .../types/CascadesTypeEvaluatorSpec.scala     |   10 +
 .../values/CascadesValueEvaluatorSpec.scala   |   12 +-
 .../transforms/ast2wdlom/Ast2WdlomSpec.scala  |    8 +
 .../AstNodeToExpressionElement.scala          |    6 +
 .../base/wdlom2wdl/WdlWriterImpl.scala        |    6 +
 42 files changed, 2666 insertions(+), 1938 deletions(-)
 create mode 100644 centaur/src/main/resources/standardTestCases/struct_literal.test
 create mode 100644 centaur/src/main/resources/standardTestCases/struct_literal/struct_literal.wdl
 create mode 100644 wdl/transforms/biscayne/src/test/cases/struct_literal.wdl
 create mode 100644 wdl/transforms/cascades/src/test/cases/struct_literal.wdl

diff --git a/centaur/src/main/resources/standardTestCases/struct_literal.test b/centaur/src/main/resources/standardTestCases/struct_literal.test
new file mode 100644
index 00000000000..72755145a02
--- /dev/null
+++ b/centaur/src/main/resources/standardTestCases/struct_literal.test
@@ -0,0 +1,12 @@
+name: struct_literal
+testFormat: workflowsuccess
+
+files {
+  workflow: struct_literal/struct_literal.wdl
+}
+
+metadata {
+  workflowName: struct_literal
+  status: Succeeded
+  "outputs.struct_literal.out": 44
+}
diff --git a/centaur/src/main/resources/standardTestCases/struct_literal/struct_literal.wdl b/centaur/src/main/resources/standardTestCases/struct_literal/struct_literal.wdl
new file mode 100644
index 00000000000..215fd40f8d3
--- /dev/null
+++ b/centaur/src/main/resources/standardTestCases/struct_literal/struct_literal.wdl
@@ -0,0 +1,68 @@
+version development-1.1
+
+struct Plant {
+  String color
+  Int id
+}
+
+struct Fungi {
+    File fungiFile
+}
+
+
+struct Animal {
+  Plant jacket
+  Fungi hat
+}
+
+task a {
+    input {
+      Plant in_plant_literal = Plant{color: "red", id: 44}
+    }
+
+  command {
+    echo "${in_plant_literal.id}"
+  }
+
+  output {
+    Animal out_animal = Animal{jacket: Plant{color: "green", id: 10}, hat: Fungi{fungiFile: stdout()}}
+  }
+
+  runtime {
+    docker: "ubuntu:latest"
+ }
+
+  meta {
+    volatile: true
+  }
+}
+
+task b {
+  input {
+  Animal in_animal
+  }
+
+  command {
+    cat ${in_animal.hat.fungiFile}
+  }
+
+  output {
+    Int out = read_int(stdout())
+  }
+
+  runtime {
+   docker: "ubuntu:latest"
+ }
+
+  meta {
+   volatile: true
+  }
+}
+
+workflow struct_literal {
+  call a
+  call b {input: in_animal=a.out_animal}
+  output {
+    Int out = b.out
+  }
+}
diff --git a/wdl/model/draft3/src/main/scala/wdl/model/draft3/elements/ExpressionElement.scala b/wdl/model/draft3/src/main/scala/wdl/model/draft3/elements/ExpressionElement.scala
index d6d8948d700..44e4c60a23a 100644
--- a/wdl/model/draft3/src/main/scala/wdl/model/draft3/elements/ExpressionElement.scala
+++ b/wdl/model/draft3/src/main/scala/wdl/model/draft3/elements/ExpressionElement.scala
@@ -33,6 +33,8 @@ object ExpressionElement {
 
   final case class KvPair(key: String, value: ExpressionElement)
   final case class ObjectLiteral(elements: Map[String, ExpressionElement]) extends ExpressionElement
+  final case class StructLiteral(structTypeName: String, elements: Map[String, ExpressionElement])
+      extends ExpressionElement
   final case class ArrayLiteral(elements: Seq[ExpressionElement]) extends ExpressionElement
   final case class MapLiteral(elements: Map[ExpressionElement, ExpressionElement]) extends ExpressionElement
   final case class PairLiteral(left: ExpressionElement, right: ExpressionElement) extends ExpressionElement
diff --git a/wdl/transforms/biscayne/src/main/java/wdl/biscayne/parser/WdlParser.java b/wdl/transforms/biscayne/src/main/java/wdl/biscayne/parser/WdlParser.java
index 26a2ea35d2e..3e4867c7784 100644
--- a/wdl/transforms/biscayne/src/main/java/wdl/biscayne/parser/WdlParser.java
+++ b/wdl/transforms/biscayne/src/main/java/wdl/biscayne/parser/WdlParser.java
@@ -1,9 +1,9 @@
 
 /*
- * This file was generated by Hermes Parser Generator on Wed Mar 22 19:44:20 2023
+ * This file was generated by Hermes Parser Generator on Fri Mar 15 14:50:13 2024
  * 
- * Hermes command: hermes generate resources/grammar.hgr --language=java --directory=./java --name=wdl --java-package=wdl.biscayne.parser --java-use-apache-commons --java-imports=org.apache.commons.lang3.StringEscapeUtils --header
- * Run from: .. (relative to this file)
+ * Hermes command: hermes generate src/main/resources/grammar.hgr --language=java --directory=src/main/java --name=wdl --java-package=wdl.biscayne.parser --java-use-apache-commons --java-imports=org.apache.commons.lang3.StringEscapeUtils --header
+ * Run from: ../../.. (relative to this file)
  * Hermes version: hermes-parser 2.0rc6
  * 
  * !!! DO NOT CHANGE THIS FILE DIRECTLY !!!
@@ -252,12 +252,12 @@ public interface ParseTreeNode {
     }
     public static class Terminal implements AstNode, ParseTreeNode
     {
-        public int id;
-        public String terminal_str;
-        public String source_string;
-        public String resource;
-        public int line;
-        public int col;
+        private int id;
+        private String terminal_str;
+        private String source_string;
+        private String resource;
+        private int line;
+        private int col;
         public Terminal(int id, String terminal_str, String source_string, String resource, int line, int col) {
             this.id = id;
             this.terminal_str = terminal_str;
@@ -516,73 +516,73 @@ public interface TerminalIdentifier {
         public String string();
     }
     public enum WdlTerminalIdentifier implements TerminalIdentifier {
-        TERMINAL_AFTER(23, "after"),
-        TERMINAL_ALIAS(27, "alias"),
-        TERMINAL_AS(10, "as"),
-        TERMINAL_ASTERISK(18, "asterisk"),
-        TERMINAL_BOOLEAN(13, "boolean"),
-        TERMINAL_CALL(60, "call"),
-        TERMINAL_CMD_ATTR_HINT(50, "cmd_attr_hint"),
-        TERMINAL_CMD_PART(11, "cmd_part"),
-        TERMINAL_COLON(28, "colon"),
-        TERMINAL_COMMA(19, "comma"),
-        TERMINAL_DASH(32, "dash"),
-        TERMINAL_DOT(42, "dot"),
-        TERMINAL_DOUBLE_AMPERSAND(29, "double_ampersand"),
-        TERMINAL_DOUBLE_EQUAL(53, "double_equal"),
-        TERMINAL_DOUBLE_PIPE(45, "double_pipe"),
-        TERMINAL_E(22, "e"),
-        TERMINAL_ELSE(57, "else"),
-        TERMINAL_EQUAL(31, "equal"),
-        TERMINAL_ESCAPE(1, "escape"),
-        TERMINAL_EXPRESSION_PLACEHOLDER_END(14, "expression_placeholder_end"),
-        TERMINAL_EXPRESSION_PLACEHOLDER_START(65, "expression_placeholder_start"),
-        TERMINAL_FLOAT(49, "float"),
-        TERMINAL_FQN(34, "fqn"),
-        TERMINAL_GT(2, "gt"),
-        TERMINAL_GTEQ(52, "gteq"),
-        TERMINAL_IDENTIFIER(46, "identifier"),
-        TERMINAL_IF(63, "if"),
-        TERMINAL_IMPORT(55, "import"),
-        TERMINAL_IN(39, "in"),
-        TERMINAL_INPUT(44, "input"),
-        TERMINAL_INTEGER(16, "integer"),
-        TERMINAL_LBRACE(59, "lbrace"),
-        TERMINAL_LPAREN(15, "lparen"),
-        TERMINAL_LSQUARE(17, "lsquare"),
-        TERMINAL_LT(36, "lt"),
-        TERMINAL_LTEQ(40, "lteq"),
-        TERMINAL_META(61, "meta"),
-        TERMINAL_META_VALUE(48, "meta_value"),
-        TERMINAL_NONE(43, "none"),
-        TERMINAL_NOT(12, "not"),
-        TERMINAL_NOT_EQUAL(51, "not_equal"),
-        TERMINAL_NULL(24, "null"),
-        TERMINAL_OBJECT(58, "object"),
-        TERMINAL_OUTPUT(7, "output"),
-        TERMINAL_PARAMETER_META(54, "parameter_meta"),
-        TERMINAL_PERCENT(64, "percent"),
-        TERMINAL_PLUS(33, "plus"),
-        TERMINAL_QMARK(21, "qmark"),
-        TERMINAL_QUOTE(20, "quote"),
-        TERMINAL_RAW_CMD_END(9, "raw_cmd_end"),
-        TERMINAL_RAW_CMD_START(26, "raw_cmd_start"),
-        TERMINAL_RAW_COMMAND(47, "raw_command"),
-        TERMINAL_RBRACE(66, "rbrace"),
-        TERMINAL_RPAREN(6, "rparen"),
-        TERMINAL_RSQUARE(3, "rsquare"),
-        TERMINAL_RUNTIME(8, "runtime"),
-        TERMINAL_SCATTER(62, "scatter"),
-        TERMINAL_SLASH(37, "slash"),
-        TERMINAL_STRING(0, "string"),
-        TERMINAL_STRUCT(5, "struct"),
-        TERMINAL_TASK(56, "task"),
-        TERMINAL_THEN(41, "then"),
-        TERMINAL_TYPE(30, "type"),
-        TERMINAL_TYPE_E(25, "type_e"),
-        TERMINAL_VERSION(4, "version"),
-        TERMINAL_VERSION_NAME(38, "version_name"),
-        TERMINAL_WORKFLOW(35, "workflow"),
+        TERMINAL_AFTER(22, "after"),
+        TERMINAL_ALIAS(60, "alias"),
+        TERMINAL_AS(44, "as"),
+        TERMINAL_ASTERISK(21, "asterisk"),
+        TERMINAL_BOOLEAN(49, "boolean"),
+        TERMINAL_CALL(41, "call"),
+        TERMINAL_CMD_ATTR_HINT(61, "cmd_attr_hint"),
+        TERMINAL_CMD_PART(65, "cmd_part"),
+        TERMINAL_COLON(25, "colon"),
+        TERMINAL_COMMA(46, "comma"),
+        TERMINAL_DASH(42, "dash"),
+        TERMINAL_DOT(45, "dot"),
+        TERMINAL_DOUBLE_AMPERSAND(63, "double_ampersand"),
+        TERMINAL_DOUBLE_EQUAL(56, "double_equal"),
+        TERMINAL_DOUBLE_PIPE(40, "double_pipe"),
+        TERMINAL_E(10, "e"),
+        TERMINAL_ELSE(66, "else"),
+        TERMINAL_EQUAL(51, "equal"),
+        TERMINAL_ESCAPE(35, "escape"),
+        TERMINAL_EXPRESSION_PLACEHOLDER_END(58, "expression_placeholder_end"),
+        TERMINAL_EXPRESSION_PLACEHOLDER_START(7, "expression_placeholder_start"),
+        TERMINAL_FLOAT(17, "float"),
+        TERMINAL_FQN(14, "fqn"),
+        TERMINAL_GT(18, "gt"),
+        TERMINAL_GTEQ(34, "gteq"),
+        TERMINAL_IDENTIFIER(5, "identifier"),
+        TERMINAL_IF(55, "if"),
+        TERMINAL_IMPORT(32, "import"),
+        TERMINAL_IN(4, "in"),
+        TERMINAL_INPUT(33, "input"),
+        TERMINAL_INTEGER(36, "integer"),
+        TERMINAL_LBRACE(3, "lbrace"),
+        TERMINAL_LPAREN(64, "lparen"),
+        TERMINAL_LSQUARE(39, "lsquare"),
+        TERMINAL_LT(57, "lt"),
+        TERMINAL_LTEQ(48, "lteq"),
+        TERMINAL_META(31, "meta"),
+        TERMINAL_META_VALUE(38, "meta_value"),
+        TERMINAL_NONE(24, "none"),
+        TERMINAL_NOT(43, "not"),
+        TERMINAL_NOT_EQUAL(20, "not_equal"),
+        TERMINAL_NULL(9, "null"),
+        TERMINAL_OBJECT(26, "object"),
+        TERMINAL_OUTPUT(54, "output"),
+        TERMINAL_PARAMETER_META(8, "parameter_meta"),
+        TERMINAL_PERCENT(6, "percent"),
+        TERMINAL_PLUS(59, "plus"),
+        TERMINAL_QMARK(1, "qmark"),
+        TERMINAL_QUOTE(28, "quote"),
+        TERMINAL_RAW_CMD_END(62, "raw_cmd_end"),
+        TERMINAL_RAW_CMD_START(50, "raw_cmd_start"),
+        TERMINAL_RAW_COMMAND(23, "raw_command"),
+        TERMINAL_RBRACE(0, "rbrace"),
+        TERMINAL_RPAREN(11, "rparen"),
+        TERMINAL_RSQUARE(47, "rsquare"),
+        TERMINAL_RUNTIME(53, "runtime"),
+        TERMINAL_SCATTER(15, "scatter"),
+        TERMINAL_SLASH(30, "slash"),
+        TERMINAL_STRING(16, "string"),
+        TERMINAL_STRUCT(37, "struct"),
+        TERMINAL_TASK(29, "task"),
+        TERMINAL_THEN(19, "then"),
+        TERMINAL_TYPE(27, "type"),
+        TERMINAL_TYPE_E(13, "type_e"),
+        TERMINAL_VERSION(52, "version"),
+        TERMINAL_VERSION_NAME(12, "version_name"),
+        TERMINAL_WORKFLOW(2, "workflow"),
         END_SENTINAL(-3, "END_SENTINAL");
         private final int id;
         private final String string;
@@ -595,112 +595,112 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
     }
     /* table[nonterminal][terminal] = rule */
     private static final int[][] table = {
+        { -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 63, -1, -1, 68, -1, -1, -1, -1, 63, -1, 65, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, 69, -1, 66, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { 52, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 71, -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, 71, -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, 71, -1, -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, 71, 71, 71, 71, -1, -1, 71 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, 74, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, 73, 74, 74, 74, 74, -1, -1, 74 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1 },
+        { 74, -1, -1, 73, -1, 74, -1, -1, 74, -1, -1, -1, -1, 74, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, 74, -1, 74, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, -1, 56, 56, 56, -1, -1, 56, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, -1, -1, 56, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, -1, -1, -1, 56, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 35, -1 },
+        { -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 32, -1, -1, 30, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, -1, -1, -1, 32, -1, -1, -1, 31, -1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, 19, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { 71, -1, -1, -1, -1, 71, -1, -1, 71, -1, -1, -1, -1, 71, -1, 71, -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, 71, -1, -1, -1, 71, -1, 71, -1, -1, -1, -1, -1, -1, -1, 71, -1, -1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, 78, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, 56, -1, 56, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, 56, -1, 56, -1, 56, -1, -1, -1, -1, -1, -1, -1, 56, -1, -1, 56, -1, -1, 56, 56, -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, 56, -1, -1, -1, 56, -1, -1, -1, -1, 56, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, 52, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 28, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, -1, 32, 26, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { 16, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, -1 },
-        { -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, -1, 63, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, -1, -1, 62, 69, 65, 64, -1, -1, -1 },
-        { -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
     };
     static {
         Map<Integer, List<TerminalIdentifier>> map = new HashMap<Integer, List<TerminalIdentifier>>();
-        map.put(75, Arrays.asList(new TerminalIdentifier[] {
+        map.put(82, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
         }));
-        map.put(128, Arrays.asList(new TerminalIdentifier[] {
+        map.put(90, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(115, Arrays.asList(new TerminalIdentifier[] {
+        map.put(68, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(68, Arrays.asList(new TerminalIdentifier[] {
+        map.put(101, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(76, Arrays.asList(new TerminalIdentifier[] {
+        map.put(86, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(117, Arrays.asList(new TerminalIdentifier[] {
+        map.put(75, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_EQUAL,
         }));
-        map.put(89, Arrays.asList(new TerminalIdentifier[] {
+        map.put(129, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(132, Arrays.asList(new TerminalIdentifier[] {
+        map.put(115, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -712,27 +712,27 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(79, Arrays.asList(new TerminalIdentifier[] {
+        map.put(103, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(95, Arrays.asList(new TerminalIdentifier[] {
+        map.put(132, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
         }));
-        map.put(81, Arrays.asList(new TerminalIdentifier[] {
+        map.put(89, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(88, Arrays.asList(new TerminalIdentifier[] {
+        map.put(73, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INPUT,
         }));
-        map.put(129, Arrays.asList(new TerminalIdentifier[] {
+        map.put(136, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(87, Arrays.asList(new TerminalIdentifier[] {
+        map.put(131, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(91, Arrays.asList(new TerminalIdentifier[] {
+        map.put(102, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_FLOAT,
             WdlTerminalIdentifier.TERMINAL_INTEGER,
@@ -742,15 +742,18 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_NULL,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(110, Arrays.asList(new TerminalIdentifier[] {
+        map.put(109, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(70, Arrays.asList(new TerminalIdentifier[] {
+        map.put(125, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(108, Arrays.asList(new TerminalIdentifier[] {
+        map.put(80, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
+        }));
+        map.put(76, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -767,10 +770,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(135, Arrays.asList(new TerminalIdentifier[] {
-            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
-        }));
-        map.put(119, Arrays.asList(new TerminalIdentifier[] {
+        map.put(108, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -787,22 +787,22 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(92, Arrays.asList(new TerminalIdentifier[] {
+        map.put(139, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(114, Arrays.asList(new TerminalIdentifier[] {
+        map.put(70, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(131, Arrays.asList(new TerminalIdentifier[] {
+        map.put(100, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(102, Arrays.asList(new TerminalIdentifier[] {
+        map.put(83, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
         }));
-        map.put(104, Arrays.asList(new TerminalIdentifier[] {
+        map.put(88, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -813,44 +813,44 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(140, Arrays.asList(new TerminalIdentifier[] {
+        map.put(126, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
         }));
-        map.put(109, Arrays.asList(new TerminalIdentifier[] {
+        map.put(104, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_ATTR_HINT,
         }));
-        map.put(126, Arrays.asList(new TerminalIdentifier[] {
+        map.put(130, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(124, Arrays.asList(new TerminalIdentifier[] {
+        map.put(137, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
         }));
-        map.put(78, Arrays.asList(new TerminalIdentifier[] {
+        map.put(127, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
         }));
-        map.put(86, Arrays.asList(new TerminalIdentifier[] {
+        map.put(78, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INPUT,
         }));
-        map.put(118, Arrays.asList(new TerminalIdentifier[] {
+        map.put(117, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(72, Arrays.asList(new TerminalIdentifier[] {
+        map.put(91, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RAW_COMMAND,
         }));
-        map.put(99, Arrays.asList(new TerminalIdentifier[] {
+        map.put(95, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
         }));
-        map.put(93, Arrays.asList(new TerminalIdentifier[] {
+        map.put(96, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(138, Arrays.asList(new TerminalIdentifier[] {
+        map.put(97, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_VERSION,
         }));
-        map.put(107, Arrays.asList(new TerminalIdentifier[] {
+        map.put(79, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -867,44 +867,44 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(97, Arrays.asList(new TerminalIdentifier[] {
+        map.put(133, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
         }));
-        map.put(133, Arrays.asList(new TerminalIdentifier[] {
+        map.put(134, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_ATTR_HINT,
         }));
-        map.put(127, Arrays.asList(new TerminalIdentifier[] {
+        map.put(123, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(94, Arrays.asList(new TerminalIdentifier[] {
+        map.put(120, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IF,
         }));
-        map.put(82, Arrays.asList(new TerminalIdentifier[] {
+        map.put(81, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
         }));
-        map.put(125, Arrays.asList(new TerminalIdentifier[] {
+        map.put(85, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
         }));
-        map.put(96, Arrays.asList(new TerminalIdentifier[] {
+        map.put(107, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(83, Arrays.asList(new TerminalIdentifier[] {
+        map.put(67, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(122, Arrays.asList(new TerminalIdentifier[] {
+        map.put(105, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(106, Arrays.asList(new TerminalIdentifier[] {
+        map.put(112, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INPUT,
         }));
-        map.put(116, Arrays.asList(new TerminalIdentifier[] {
+        map.put(114, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(100, Arrays.asList(new TerminalIdentifier[] {
+        map.put(124, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -921,16 +921,16 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(136, Arrays.asList(new TerminalIdentifier[] {
+        map.put(106, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_META,
         }));
-        map.put(112, Arrays.asList(new TerminalIdentifier[] {
+        map.put(93, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(141, Arrays.asList(new TerminalIdentifier[] {
+        map.put(77, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(120, Arrays.asList(new TerminalIdentifier[] {
+        map.put(135, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_FLOAT,
             WdlTerminalIdentifier.TERMINAL_INTEGER,
@@ -940,59 +940,59 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_NULL,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(90, Arrays.asList(new TerminalIdentifier[] {
+        map.put(74, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(77, Arrays.asList(new TerminalIdentifier[] {
+        map.put(87, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(84, Arrays.asList(new TerminalIdentifier[] {
+        map.put(122, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_OUTPUT,
         }));
-        map.put(105, Arrays.asList(new TerminalIdentifier[] {
+        map.put(72, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_PARAMETER_META,
         }));
-        map.put(85, Arrays.asList(new TerminalIdentifier[] {
+        map.put(128, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(80, Arrays.asList(new TerminalIdentifier[] {
+        map.put(84, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RUNTIME,
         }));
-        map.put(121, Arrays.asList(new TerminalIdentifier[] {
+        map.put(116, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_SCATTER,
         }));
-        map.put(101, Arrays.asList(new TerminalIdentifier[] {
+        map.put(113, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_EQUAL,
         }));
-        map.put(98, Arrays.asList(new TerminalIdentifier[] {
+        map.put(99, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(69, Arrays.asList(new TerminalIdentifier[] {
+        map.put(118, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(139, Arrays.asList(new TerminalIdentifier[] {
+        map.put(111, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(130, Arrays.asList(new TerminalIdentifier[] {
+        map.put(92, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(74, Arrays.asList(new TerminalIdentifier[] {
+        map.put(94, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
         }));
-        map.put(73, Arrays.asList(new TerminalIdentifier[] {
+        map.put(110, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(113, Arrays.asList(new TerminalIdentifier[] {
+        map.put(138, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_TASK,
         }));
-        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+        map.put(98, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1003,15 +1003,15 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(67, Arrays.asList(new TerminalIdentifier[] {
+        map.put(140, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(71, Arrays.asList(new TerminalIdentifier[] {
+        map.put(121, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_VERSION,
         }));
-        map.put(137, Arrays.asList(new TerminalIdentifier[] {
+        map.put(69, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1023,48 +1023,48 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(103, Arrays.asList(new TerminalIdentifier[] {
+        map.put(71, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_META,
         }));
-        map.put(111, Arrays.asList(new TerminalIdentifier[] {
+        map.put(119, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_PARAMETER_META,
         }));
-        map.put(134, Arrays.asList(new TerminalIdentifier[] {
+        map.put(141, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
         nonterminal_first = Collections.unmodifiableMap(map);
     }
     static {
         Map<Integer, List<TerminalIdentifier>> map = new HashMap<Integer, List<TerminalIdentifier>>();
-        map.put(75, Arrays.asList(new TerminalIdentifier[] {
+        map.put(82, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(128, Arrays.asList(new TerminalIdentifier[] {
+        map.put(90, Arrays.asList(new TerminalIdentifier[] {
         }));
-        map.put(115, Arrays.asList(new TerminalIdentifier[] {
+        map.put(68, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(68, Arrays.asList(new TerminalIdentifier[] {
+        map.put(101, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(76, Arrays.asList(new TerminalIdentifier[] {
+        map.put(86, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(117, Arrays.asList(new TerminalIdentifier[] {
+        map.put(75, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(89, Arrays.asList(new TerminalIdentifier[] {
+        map.put(129, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(132, Arrays.asList(new TerminalIdentifier[] {
+        map.put(115, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(79, Arrays.asList(new TerminalIdentifier[] {
+        map.put(103, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1078,7 +1078,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(95, Arrays.asList(new TerminalIdentifier[] {
+        map.put(132, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1092,7 +1092,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(81, Arrays.asList(new TerminalIdentifier[] {
+        map.put(89, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1105,60 +1105,60 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(88, Arrays.asList(new TerminalIdentifier[] {
+        map.put(73, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(129, Arrays.asList(new TerminalIdentifier[] {
+        map.put(136, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(87, Arrays.asList(new TerminalIdentifier[] {
+        map.put(131, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(91, Arrays.asList(new TerminalIdentifier[] {
+        map.put(102, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(110, Arrays.asList(new TerminalIdentifier[] {
+        map.put(109, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(70, Arrays.asList(new TerminalIdentifier[] {
+        map.put(125, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(108, Arrays.asList(new TerminalIdentifier[] {
+        map.put(80, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_RBRACE,
+        }));
+        map.put(76, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RPAREN,
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(135, Arrays.asList(new TerminalIdentifier[] {
-            WdlTerminalIdentifier.TERMINAL_RBRACE,
-        }));
-        map.put(119, Arrays.asList(new TerminalIdentifier[] {
+        map.put(108, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(92, Arrays.asList(new TerminalIdentifier[] {
+        map.put(139, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(114, Arrays.asList(new TerminalIdentifier[] {
+        map.put(70, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(131, Arrays.asList(new TerminalIdentifier[] {
+        map.put(100, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(102, Arrays.asList(new TerminalIdentifier[] {
+        map.put(83, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(104, Arrays.asList(new TerminalIdentifier[] {
+        map.put(88, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(140, Arrays.asList(new TerminalIdentifier[] {
+        map.put(126, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RAW_CMD_END,
         }));
-        map.put(109, Arrays.asList(new TerminalIdentifier[] {
+        map.put(104, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -1175,7 +1175,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(126, Arrays.asList(new TerminalIdentifier[] {
+        map.put(130, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1189,7 +1189,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(124, Arrays.asList(new TerminalIdentifier[] {
+        map.put(137, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1202,7 +1202,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(78, Arrays.asList(new TerminalIdentifier[] {
+        map.put(127, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1217,10 +1217,10 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(86, Arrays.asList(new TerminalIdentifier[] {
+        map.put(78, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(118, Arrays.asList(new TerminalIdentifier[] {
+        map.put(117, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1233,7 +1233,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(72, Arrays.asList(new TerminalIdentifier[] {
+        map.put(91, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1245,12 +1245,12 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(99, Arrays.asList(new TerminalIdentifier[] {
+        map.put(95, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_RAW_CMD_END,
         }));
-        map.put(93, Arrays.asList(new TerminalIdentifier[] {
+        map.put(96, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1265,9 +1265,9 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(138, Arrays.asList(new TerminalIdentifier[] {
+        map.put(97, Arrays.asList(new TerminalIdentifier[] {
         }));
-        map.put(107, Arrays.asList(new TerminalIdentifier[] {
+        map.put(79, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ASTERISK,
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_CALL,
@@ -1315,7 +1315,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(97, Arrays.asList(new TerminalIdentifier[] {
+        map.put(133, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
@@ -1323,7 +1323,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_RAW_CMD_END,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(133, Arrays.asList(new TerminalIdentifier[] {
+        map.put(134, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_CMD_ATTR_HINT,
             WdlTerminalIdentifier.TERMINAL_DASH,
@@ -1341,12 +1341,12 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(127, Arrays.asList(new TerminalIdentifier[] {
+        map.put(123, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(94, Arrays.asList(new TerminalIdentifier[] {
+        map.put(120, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1359,37 +1359,37 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(82, Arrays.asList(new TerminalIdentifier[] {
+        map.put(81, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(125, Arrays.asList(new TerminalIdentifier[] {
+        map.put(85, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(96, Arrays.asList(new TerminalIdentifier[] {
+        map.put(107, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(83, Arrays.asList(new TerminalIdentifier[] {
+        map.put(67, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(122, Arrays.asList(new TerminalIdentifier[] {
+        map.put(105, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(106, Arrays.asList(new TerminalIdentifier[] {
+        map.put(112, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1404,15 +1404,15 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(116, Arrays.asList(new TerminalIdentifier[] {
+        map.put(114, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(100, Arrays.asList(new TerminalIdentifier[] {
+        map.put(124, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(136, Arrays.asList(new TerminalIdentifier[] {
+        map.put(106, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1424,12 +1424,12 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(112, Arrays.asList(new TerminalIdentifier[] {
+        map.put(93, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(141, Arrays.asList(new TerminalIdentifier[] {
+        map.put(77, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1444,23 +1444,23 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(120, Arrays.asList(new TerminalIdentifier[] {
+        map.put(135, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(90, Arrays.asList(new TerminalIdentifier[] {
+        map.put(74, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(77, Arrays.asList(new TerminalIdentifier[] {
+        map.put(87, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(84, Arrays.asList(new TerminalIdentifier[] {
+        map.put(122, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1475,7 +1475,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(105, Arrays.asList(new TerminalIdentifier[] {
+        map.put(72, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1487,7 +1487,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(85, Arrays.asList(new TerminalIdentifier[] {
+        map.put(128, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1499,7 +1499,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(80, Arrays.asList(new TerminalIdentifier[] {
+        map.put(84, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1511,7 +1511,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(121, Arrays.asList(new TerminalIdentifier[] {
+        map.put(116, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1524,7 +1524,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(101, Arrays.asList(new TerminalIdentifier[] {
+        map.put(113, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1539,7 +1539,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(98, Arrays.asList(new TerminalIdentifier[] {
+        map.put(99, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1550,13 +1550,13 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(69, Arrays.asList(new TerminalIdentifier[] {
+        map.put(118, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(139, Arrays.asList(new TerminalIdentifier[] {
+        map.put(111, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ASTERISK,
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_CALL,
@@ -1604,29 +1604,29 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(130, Arrays.asList(new TerminalIdentifier[] {
+        map.put(92, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(74, Arrays.asList(new TerminalIdentifier[] {
+        map.put(94, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(73, Arrays.asList(new TerminalIdentifier[] {
+        map.put(110, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(113, Arrays.asList(new TerminalIdentifier[] {
+        map.put(138, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+        map.put(98, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1638,15 +1638,15 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(67, Arrays.asList(new TerminalIdentifier[] {
+        map.put(140, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(71, Arrays.asList(new TerminalIdentifier[] {
+        map.put(121, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
         }));
-        map.put(137, Arrays.asList(new TerminalIdentifier[] {
+        map.put(69, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1659,7 +1659,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(103, Arrays.asList(new TerminalIdentifier[] {
+        map.put(71, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1672,7 +1672,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(111, Arrays.asList(new TerminalIdentifier[] {
+        map.put(119, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1685,7 +1685,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(134, Arrays.asList(new TerminalIdentifier[] {
+        map.put(141, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
@@ -1780,6 +1780,9 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
         map.put(120, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
+        }));
+        map.put(122, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -1796,10 +1799,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(124, Arrays.asList(new TerminalIdentifier[] {
-            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
-        }));
-        map.put(127, Arrays.asList(new TerminalIdentifier[] {
+        map.put(128, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -2104,7 +2104,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+        map.put(125, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -2121,7 +2121,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(122, Arrays.asList(new TerminalIdentifier[] {
+        map.put(124, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -2138,46 +2138,49 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(131, Arrays.asList(new TerminalIdentifier[] {
+        map.put(132, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(133, Arrays.asList(new TerminalIdentifier[] {
+        map.put(134, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
         }));
         map.put(119, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_DASH,
         }));
-        map.put(135, Arrays.asList(new TerminalIdentifier[] {
+        map.put(136, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_FLOAT,
         }));
-        map.put(132, Arrays.asList(new TerminalIdentifier[] {
+        map.put(133, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
         map.put(121, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(130, Arrays.asList(new TerminalIdentifier[] {
+        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
+        }));
+        map.put(131, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IF,
         }));
-        map.put(134, Arrays.asList(new TerminalIdentifier[] {
+        map.put(135, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INTEGER,
         }));
-        map.put(128, Arrays.asList(new TerminalIdentifier[] {
+        map.put(129, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(129, Arrays.asList(new TerminalIdentifier[] {
+        map.put(130, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LPAREN,
         }));
-        map.put(126, Arrays.asList(new TerminalIdentifier[] {
+        map.put(127, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LSQUARE,
         }));
-        map.put(136, Arrays.asList(new TerminalIdentifier[] {
+        map.put(137, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_NONE,
         }));
         map.put(117, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_NOT,
         }));
-        map.put(125, Arrays.asList(new TerminalIdentifier[] {
+        map.put(126, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_OBJECT,
         }));
         map.put(118, Arrays.asList(new TerminalIdentifier[] {
@@ -2407,218 +2410,219 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
     }
     static {
         Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
-        map.put(75, new ArrayList<String>());
-        map.put(128, new ArrayList<String>());
-        map.put(115, new ArrayList<String>());
+        map.put(82, new ArrayList<String>());
+        map.put(90, new ArrayList<String>());
         map.put(68, new ArrayList<String>());
-        map.put(76, new ArrayList<String>());
-        map.put(117, new ArrayList<String>());
-        map.put(89, new ArrayList<String>());
-        map.put(132, new ArrayList<String>());
-        map.put(79, new ArrayList<String>());
-        map.put(95, new ArrayList<String>());
-        map.put(81, new ArrayList<String>());
-        map.put(88, new ArrayList<String>());
+        map.put(101, new ArrayList<String>());
+        map.put(86, new ArrayList<String>());
+        map.put(75, new ArrayList<String>());
         map.put(129, new ArrayList<String>());
-        map.put(87, new ArrayList<String>());
-        map.put(91, new ArrayList<String>());
-        map.put(110, new ArrayList<String>());
-        map.put(70, new ArrayList<String>());
-        map.put(108, new ArrayList<String>());
-        map.put(135, new ArrayList<String>());
-        map.put(119, new ArrayList<String>());
-        map.put(92, new ArrayList<String>());
-        map.put(114, new ArrayList<String>());
+        map.put(115, new ArrayList<String>());
+        map.put(103, new ArrayList<String>());
+        map.put(132, new ArrayList<String>());
+        map.put(89, new ArrayList<String>());
+        map.put(73, new ArrayList<String>());
+        map.put(136, new ArrayList<String>());
         map.put(131, new ArrayList<String>());
         map.put(102, new ArrayList<String>());
-        map.put(104, new ArrayList<String>());
-        map.put(140, new ArrayList<String>());
         map.put(109, new ArrayList<String>());
+        map.put(125, new ArrayList<String>());
+        map.put(80, new ArrayList<String>());
+        map.put(76, new ArrayList<String>());
+        map.put(108, new ArrayList<String>());
+        map.put(139, new ArrayList<String>());
+        map.put(70, new ArrayList<String>());
+        map.put(100, new ArrayList<String>());
+        map.put(83, new ArrayList<String>());
+        map.put(88, new ArrayList<String>());
         map.put(126, new ArrayList<String>());
-        map.put(124, new ArrayList<String>());
+        map.put(104, new ArrayList<String>());
+        map.put(130, new ArrayList<String>());
+        map.put(137, new ArrayList<String>());
+        map.put(127, new ArrayList<String>());
         map.put(78, new ArrayList<String>());
-        map.put(86, new ArrayList<String>());
-        map.put(118, new ArrayList<String>());
-        map.put(72, new ArrayList<String>());
-        map.put(99, new ArrayList<String>());
-        map.put(93, new ArrayList<String>());
-        map.put(138, new ArrayList<String>());
-        map.put(107, new ArrayList<String>());
+        map.put(117, new ArrayList<String>());
+        map.put(91, new ArrayList<String>());
+        map.put(95, new ArrayList<String>());
+        map.put(96, new ArrayList<String>());
         map.put(97, new ArrayList<String>());
+        map.put(79, new ArrayList<String>());
         map.put(133, new ArrayList<String>());
-        map.put(127, new ArrayList<String>());
-        map.put(94, new ArrayList<String>());
-        map.put(82, new ArrayList<String>());
-        map.put(125, new ArrayList<String>());
-        map.put(96, new ArrayList<String>());
-        map.put(83, new ArrayList<String>());
-        map.put(122, new ArrayList<String>());
-        map.put(106, new ArrayList<String>());
-        map.put(116, new ArrayList<String>());
-        map.put(100, new ArrayList<String>());
-        map.put(136, new ArrayList<String>());
-        map.put(112, new ArrayList<String>());
-        map.put(141, new ArrayList<String>());
+        map.put(134, new ArrayList<String>());
+        map.put(123, new ArrayList<String>());
         map.put(120, new ArrayList<String>());
-        map.put(90, new ArrayList<String>());
+        map.put(81, new ArrayList<String>());
+        map.put(85, new ArrayList<String>());
+        map.put(107, new ArrayList<String>());
+        map.put(67, new ArrayList<String>());
+        map.put(105, new ArrayList<String>());
+        map.put(112, new ArrayList<String>());
+        map.put(114, new ArrayList<String>());
+        map.put(124, new ArrayList<String>());
+        map.put(106, new ArrayList<String>());
+        map.put(93, new ArrayList<String>());
         map.put(77, new ArrayList<String>());
+        map.put(135, new ArrayList<String>());
+        map.put(74, new ArrayList<String>());
+        map.put(87, new ArrayList<String>());
+        map.put(122, new ArrayList<String>());
+        map.put(72, new ArrayList<String>());
+        map.put(128, new ArrayList<String>());
         map.put(84, new ArrayList<String>());
-        map.put(105, new ArrayList<String>());
-        map.put(85, new ArrayList<String>());
-        map.put(80, new ArrayList<String>());
-        map.put(121, new ArrayList<String>());
-        map.put(101, new ArrayList<String>());
+        map.put(116, new ArrayList<String>());
+        map.put(113, new ArrayList<String>());
+        map.put(99, new ArrayList<String>());
+        map.put(118, new ArrayList<String>());
+        map.put(111, new ArrayList<String>());
+        map.put(92, new ArrayList<String>());
+        map.put(94, new ArrayList<String>());
+        map.put(110, new ArrayList<String>());
+        map.put(138, new ArrayList<String>());
         map.put(98, new ArrayList<String>());
+        map.put(140, new ArrayList<String>());
+        map.put(121, new ArrayList<String>());
         map.put(69, new ArrayList<String>());
-        map.put(139, new ArrayList<String>());
-        map.put(130, new ArrayList<String>());
-        map.put(74, new ArrayList<String>());
-        map.put(73, new ArrayList<String>());
-        map.put(113, new ArrayList<String>());
-        map.put(123, new ArrayList<String>());
-        map.put(67, new ArrayList<String>());
         map.put(71, new ArrayList<String>());
-        map.put(137, new ArrayList<String>());
-        map.put(103, new ArrayList<String>());
-        map.put(111, new ArrayList<String>());
-        map.put(134, new ArrayList<String>());
-        map.get(75).add("$_gen0 = list($import)");
-        map.get(128).add("$_gen1 = list($file_body_element)");
-        map.get(115).add("$_gen10 = list($input_declaration)");
-        map.get(68).add("$_gen11 = list($kv)");
-        map.get(76).add("$_gen12 = list($meta_kv)");
-        map.get(117).add("$_gen13 = $setter");
-        map.get(117).add("$_gen13 = :_empty");
-        map.get(89).add("$_gen14 = list($output_kv)");
-        map.get(132).add("$_gen15 = list($wf_body_element)");
-        map.get(79).add("$_gen16 = $alias");
-        map.get(79).add("$_gen16 = :_empty");
-        map.get(95).add("$_gen17 = list($call_after)");
-        map.get(81).add("$_gen18 = $call_brace_block");
-        map.get(81).add("$_gen18 = :_empty");
-        map.get(88).add("$_gen19 = $call_body");
-        map.get(88).add("$_gen19 = :_empty");
-        map.get(129).add("$_gen2 = list($struct_declaration)");
-        map.get(87).add("$_gen20 = list($input_kv, :comma)");
-        map.get(91).add("$_gen21 = list($meta_value, :comma)");
-        map.get(110).add("$_gen22 = list($meta_kv, :comma)");
-        map.get(70).add("$_gen23 = list($type_e, :comma)");
-        map.get(108).add("$_gen24 = list($e, :comma)");
-        map.get(135).add("$_gen25 = list($object_kv, :comma)");
-        map.get(119).add("$_gen26 = list($map_kv, :comma)");
-        map.get(92).add("$_gen3 = list($static_string_piece)");
-        map.get(114).add("$_gen4 = list($string_piece)");
-        map.get(131).add("$_gen5 = $import_namespace");
-        map.get(131).add("$_gen5 = :_empty");
-        map.get(102).add("$_gen6 = list($import_alias)");
-        map.get(104).add("$_gen7 = list($task_sections)");
-        map.get(140).add("$_gen8 = list($command_part)");
-        map.get(109).add("$_gen9 = list($expression_placeholder_kv)");
-        map.get(126).add("$alias = :as :identifier -> $1");
-        map.get(124).add("$call = :call :fqn $_gen16 $_gen17 $_gen18 -> Call( task=$1, alias=$2, after=$3, body=$4 )");
-        map.get(78).add("$call_after = :after :identifier -> $1");
-        map.get(86).add("$call_body = :input :colon $_gen20 -> CallBody( inputs=$2 )");
-        map.get(118).add("$call_brace_block = :lbrace $_gen19 :rbrace -> $1");
-        map.get(72).add("$command = :raw_command :raw_cmd_start $_gen8 :raw_cmd_end -> RawCommand( parts=$2 )");
-        map.get(99).add("$command_part = $expression_placeholder");
-        map.get(99).add("$command_part = :cmd_part");
-        map.get(93).add("$declaration = $type_e :identifier $setter -> Declaration( type=$0, name=$1, expression=$2 )");
-        map.get(138).add("$document = $version $_gen0 $_gen1 -> Draft3File( version=$0, imports=$1, body=$2 )");
-        map.get(107).add("$e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
-        map.get(107).add("$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
-        map.get(107).add("$e = $string_literal");
-        map.get(107).add("$e = :boolean");
-        map.get(107).add("$e = :dash $e -> UnaryNegation( expression=$1 )");
-        map.get(107).add("$e = :float");
-        map.get(107).add("$e = :identifier");
-        map.get(107).add("$e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 )");
-        map.get(107).add("$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
-        map.get(107).add("$e = :integer");
-        map.get(107).add("$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
-        map.get(107).add("$e = :lparen $_gen24 :rparen -> TupleLiteral( values=$1 )");
-        map.get(107).add("$e = :lsquare $_gen24 :rsquare -> ArrayLiteral( values=$1 )");
-        map.get(107).add("$e = :none");
-        map.get(107).add("$e = :not $e -> LogicalNot( expression=$1 )");
-        map.get(107).add("$e = :object :lbrace $_gen25 :rbrace -> ObjectLiteral( map=$2 )");
-        map.get(107).add("$e = :plus $e -> UnaryPlus( expression=$1 )");
-        map.get(97).add("$expression_placeholder = :expression_placeholder_start $_gen9 $e :expression_placeholder_end -> ExpressionPlaceholder( attributes=$1, expr=$2 )");
-        map.get(133).add("$expression_placeholder_kv = :cmd_attr_hint :identifier :equal $e -> ExpressionPlaceholderAttr( key=$1, value=$3 )");
-        map.get(127).add("$file_body_element = $struct");
-        map.get(127).add("$file_body_element = $task");
-        map.get(127).add("$file_body_element = $workflow");
-        map.get(94).add("$if_stmt = :if :lparen $e :rparen :lbrace $_gen15 :rbrace -> If( expression=$2, body=$5 )");
-        map.get(82).add("$import = :import $static_string $_gen5 $_gen6 -> Import( uri=$1, namespace=$2, aliases=$3 )");
-        map.get(125).add("$import_alias = :alias :identifier :as :identifier -> ImportAlias( old_name=$1, new_name=$3 )");
-        map.get(96).add("$import_namespace = :as :identifier -> $1");
-        map.get(83).add("$input_declaration = $type_e :identifier $_gen13 -> InputDeclaration( type=$0, name=$1, expression=$2 )");
-        map.get(122).add("$input_kv = :identifier :equal $e -> ObjectKV( key=$0, value=$2 )");
-        map.get(106).add("$inputs = :input :lbrace $_gen10 :rbrace -> Inputs( inputs=$2 )");
-        map.get(116).add("$kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 )");
-        map.get(100).add("$map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 )");
-        map.get(136).add("$meta = :meta $meta_map -> Meta( map=$1 )");
-        map.get(112).add("$meta_kv = :identifier :colon $meta_value -> MetaKvPair( key=$0, value=$2 )");
-        map.get(141).add("$meta_map = :lbrace $_gen12 :rbrace -> $1");
-        map.get(120).add("$meta_value = $static_string");
-        map.get(120).add("$meta_value = :boolean");
-        map.get(120).add("$meta_value = :float");
-        map.get(120).add("$meta_value = :integer");
-        map.get(120).add("$meta_value = :lbrace $_gen22 :rbrace -> MetaObject( map=$1 )");
-        map.get(120).add("$meta_value = :lsquare $_gen21 :rsquare -> MetaArray( values=$1 )");
-        map.get(120).add("$meta_value = :null");
-        map.get(90).add("$object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 )");
-        map.get(77).add("$output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 )");
-        map.get(84).add("$outputs = :output :lbrace $_gen14 :rbrace -> Outputs( outputs=$2 )");
-        map.get(105).add("$parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
-        map.get(85).add("$rt_map = :lbrace $_gen11 :rbrace -> $1");
-        map.get(80).add("$runtime = :runtime $rt_map -> Runtime( map=$1 )");
-        map.get(121).add("$scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen15 :rbrace -> Scatter( item=$2, collection=$4, body=$7 )");
-        map.get(101).add("$setter = :equal $e -> $1");
-        map.get(98).add("$static_string = :quote $_gen3 :quote -> StaticString( value=$1 )");
-        map.get(69).add("$static_string_piece = :escape");
-        map.get(69).add("$static_string_piece = :string");
-        map.get(139).add("$string_literal = :quote $_gen4 :quote -> StringLiteral( pieces=$1 )");
-        map.get(130).add("$string_piece = $expression_placeholder");
-        map.get(130).add("$string_piece = $static_string_piece");
-        map.get(74).add("$struct = :struct :identifier :lbrace $_gen2 :rbrace -> Struct( name=$1, entries=$3 )");
-        map.get(73).add("$struct_declaration = $type_e :identifier -> StructEntry( type=$0, name=$1 )");
-        map.get(113).add("$task = :task :identifier :lbrace $_gen7 :rbrace -> Task( name=$1, sections=$3 )");
-        map.get(123).add("$task_sections = $command");
-        map.get(123).add("$task_sections = $declaration");
-        map.get(123).add("$task_sections = $inputs");
-        map.get(123).add("$task_sections = $meta");
-        map.get(123).add("$task_sections = $outputs");
-        map.get(123).add("$task_sections = $parameter_meta");
-        map.get(123).add("$task_sections = $runtime");
-        map.get(67).add("$type_e = :identifier");
-        map.get(67).add("$type_e = :type");
-        map.get(67).add("$type_e = :type <=> :lsquare $_gen23 :rsquare -> Type( name=$0, subtype=$2 )");
-        map.get(67).add("$type_e = :type <=> :plus -> NonEmptyType( innerType=$0 )");
-        map.get(67).add("$type_e = :type <=> :qmark -> OptionalType( innerType=$0 )");
-        map.get(71).add("$version = :version :version_name -> VersionDeclaration( v=$1 )");
-        map.get(137).add("$wf_body_element = $call");
-        map.get(137).add("$wf_body_element = $declaration");
-        map.get(137).add("$wf_body_element = $if_stmt");
-        map.get(137).add("$wf_body_element = $inputs");
-        map.get(137).add("$wf_body_element = $outputs");
-        map.get(137).add("$wf_body_element = $scatter");
-        map.get(137).add("$wf_body_element = $wf_meta");
-        map.get(137).add("$wf_body_element = $wf_parameter_meta");
-        map.get(103).add("$wf_meta = :meta $meta_map -> Meta( map=$1 )");
-        map.get(111).add("$wf_parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
-        map.get(134).add("$workflow = :workflow :identifier :lbrace $_gen15 :rbrace -> Workflow( name=$1, body=$3 )");
+        map.put(119, new ArrayList<String>());
+        map.put(141, new ArrayList<String>());
+        map.get(82).add("$_gen0 = list($import)");
+        map.get(90).add("$_gen1 = list($file_body_element)");
+        map.get(68).add("$_gen10 = list($input_declaration)");
+        map.get(101).add("$_gen11 = list($kv)");
+        map.get(86).add("$_gen12 = list($meta_kv)");
+        map.get(75).add("$_gen13 = $setter");
+        map.get(75).add("$_gen13 = :_empty");
+        map.get(129).add("$_gen14 = list($output_kv)");
+        map.get(115).add("$_gen15 = list($wf_body_element)");
+        map.get(103).add("$_gen16 = $alias");
+        map.get(103).add("$_gen16 = :_empty");
+        map.get(132).add("$_gen17 = list($call_after)");
+        map.get(89).add("$_gen18 = $call_brace_block");
+        map.get(89).add("$_gen18 = :_empty");
+        map.get(73).add("$_gen19 = $call_body");
+        map.get(73).add("$_gen19 = :_empty");
+        map.get(136).add("$_gen2 = list($struct_declaration)");
+        map.get(131).add("$_gen20 = list($input_kv, :comma)");
+        map.get(102).add("$_gen21 = list($meta_value, :comma)");
+        map.get(109).add("$_gen22 = list($meta_kv, :comma)");
+        map.get(125).add("$_gen23 = list($type_e, :comma)");
+        map.get(80).add("$_gen24 = list($object_kv, :comma)");
+        map.get(76).add("$_gen25 = list($e, :comma)");
+        map.get(108).add("$_gen26 = list($map_kv, :comma)");
+        map.get(139).add("$_gen3 = list($static_string_piece)");
+        map.get(70).add("$_gen4 = list($string_piece)");
+        map.get(100).add("$_gen5 = $import_namespace");
+        map.get(100).add("$_gen5 = :_empty");
+        map.get(83).add("$_gen6 = list($import_alias)");
+        map.get(88).add("$_gen7 = list($task_sections)");
+        map.get(126).add("$_gen8 = list($command_part)");
+        map.get(104).add("$_gen9 = list($expression_placeholder_kv)");
+        map.get(130).add("$alias = :as :identifier -> $1");
+        map.get(137).add("$call = :call :fqn $_gen16 $_gen17 $_gen18 -> Call( task=$1, alias=$2, after=$3, body=$4 )");
+        map.get(127).add("$call_after = :after :identifier -> $1");
+        map.get(78).add("$call_body = :input :colon $_gen20 -> CallBody( inputs=$2 )");
+        map.get(117).add("$call_brace_block = :lbrace $_gen19 :rbrace -> $1");
+        map.get(91).add("$command = :raw_command :raw_cmd_start $_gen8 :raw_cmd_end -> RawCommand( parts=$2 )");
+        map.get(95).add("$command_part = $expression_placeholder");
+        map.get(95).add("$command_part = :cmd_part");
+        map.get(96).add("$declaration = $type_e :identifier $setter -> Declaration( type=$0, name=$1, expression=$2 )");
+        map.get(97).add("$document = $version $_gen0 $_gen1 -> Draft3File( version=$0, imports=$1, body=$2 )");
+        map.get(79).add("$e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
+        map.get(79).add("$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
+        map.get(79).add("$e = $string_literal");
+        map.get(79).add("$e = :boolean");
+        map.get(79).add("$e = :dash $e -> UnaryNegation( expression=$1 )");
+        map.get(79).add("$e = :float");
+        map.get(79).add("$e = :identifier");
+        map.get(79).add("$e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 )");
+        map.get(79).add("$e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 )");
+        map.get(79).add("$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
+        map.get(79).add("$e = :integer");
+        map.get(79).add("$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
+        map.get(79).add("$e = :lparen $_gen25 :rparen -> TupleLiteral( values=$1 )");
+        map.get(79).add("$e = :lsquare $_gen25 :rsquare -> ArrayLiteral( values=$1 )");
+        map.get(79).add("$e = :none");
+        map.get(79).add("$e = :not $e -> LogicalNot( expression=$1 )");
+        map.get(79).add("$e = :object :lbrace $_gen24 :rbrace -> ObjectLiteral( map=$2 )");
+        map.get(79).add("$e = :plus $e -> UnaryPlus( expression=$1 )");
+        map.get(133).add("$expression_placeholder = :expression_placeholder_start $_gen9 $e :expression_placeholder_end -> ExpressionPlaceholder( attributes=$1, expr=$2 )");
+        map.get(134).add("$expression_placeholder_kv = :cmd_attr_hint :identifier :equal $e -> ExpressionPlaceholderAttr( key=$1, value=$3 )");
+        map.get(123).add("$file_body_element = $struct");
+        map.get(123).add("$file_body_element = $task");
+        map.get(123).add("$file_body_element = $workflow");
+        map.get(120).add("$if_stmt = :if :lparen $e :rparen :lbrace $_gen15 :rbrace -> If( expression=$2, body=$5 )");
+        map.get(81).add("$import = :import $static_string $_gen5 $_gen6 -> Import( uri=$1, namespace=$2, aliases=$3 )");
+        map.get(85).add("$import_alias = :alias :identifier :as :identifier -> ImportAlias( old_name=$1, new_name=$3 )");
+        map.get(107).add("$import_namespace = :as :identifier -> $1");
+        map.get(67).add("$input_declaration = $type_e :identifier $_gen13 -> InputDeclaration( type=$0, name=$1, expression=$2 )");
+        map.get(105).add("$input_kv = :identifier :equal $e -> ObjectKV( key=$0, value=$2 )");
+        map.get(112).add("$inputs = :input :lbrace $_gen10 :rbrace -> Inputs( inputs=$2 )");
+        map.get(114).add("$kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 )");
+        map.get(124).add("$map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 )");
+        map.get(106).add("$meta = :meta $meta_map -> Meta( map=$1 )");
+        map.get(93).add("$meta_kv = :identifier :colon $meta_value -> MetaKvPair( key=$0, value=$2 )");
+        map.get(77).add("$meta_map = :lbrace $_gen12 :rbrace -> $1");
+        map.get(135).add("$meta_value = $static_string");
+        map.get(135).add("$meta_value = :boolean");
+        map.get(135).add("$meta_value = :float");
+        map.get(135).add("$meta_value = :integer");
+        map.get(135).add("$meta_value = :lbrace $_gen22 :rbrace -> MetaObject( map=$1 )");
+        map.get(135).add("$meta_value = :lsquare $_gen21 :rsquare -> MetaArray( values=$1 )");
+        map.get(135).add("$meta_value = :null");
+        map.get(74).add("$object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 )");
+        map.get(87).add("$output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 )");
+        map.get(122).add("$outputs = :output :lbrace $_gen14 :rbrace -> Outputs( outputs=$2 )");
+        map.get(72).add("$parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
+        map.get(128).add("$rt_map = :lbrace $_gen11 :rbrace -> $1");
+        map.get(84).add("$runtime = :runtime $rt_map -> Runtime( map=$1 )");
+        map.get(116).add("$scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen15 :rbrace -> Scatter( item=$2, collection=$4, body=$7 )");
+        map.get(113).add("$setter = :equal $e -> $1");
+        map.get(99).add("$static_string = :quote $_gen3 :quote -> StaticString( value=$1 )");
+        map.get(118).add("$static_string_piece = :escape");
+        map.get(118).add("$static_string_piece = :string");
+        map.get(111).add("$string_literal = :quote $_gen4 :quote -> StringLiteral( pieces=$1 )");
+        map.get(92).add("$string_piece = $expression_placeholder");
+        map.get(92).add("$string_piece = $static_string_piece");
+        map.get(94).add("$struct = :struct :identifier :lbrace $_gen2 :rbrace -> Struct( name=$1, entries=$3 )");
+        map.get(110).add("$struct_declaration = $type_e :identifier -> StructEntry( type=$0, name=$1 )");
+        map.get(138).add("$task = :task :identifier :lbrace $_gen7 :rbrace -> Task( name=$1, sections=$3 )");
+        map.get(98).add("$task_sections = $command");
+        map.get(98).add("$task_sections = $declaration");
+        map.get(98).add("$task_sections = $inputs");
+        map.get(98).add("$task_sections = $meta");
+        map.get(98).add("$task_sections = $outputs");
+        map.get(98).add("$task_sections = $parameter_meta");
+        map.get(98).add("$task_sections = $runtime");
+        map.get(140).add("$type_e = :identifier");
+        map.get(140).add("$type_e = :type");
+        map.get(140).add("$type_e = :type <=> :lsquare $_gen23 :rsquare -> Type( name=$0, subtype=$2 )");
+        map.get(140).add("$type_e = :type <=> :plus -> NonEmptyType( innerType=$0 )");
+        map.get(140).add("$type_e = :type <=> :qmark -> OptionalType( innerType=$0 )");
+        map.get(121).add("$version = :version :version_name -> VersionDeclaration( v=$1 )");
+        map.get(69).add("$wf_body_element = $call");
+        map.get(69).add("$wf_body_element = $declaration");
+        map.get(69).add("$wf_body_element = $if_stmt");
+        map.get(69).add("$wf_body_element = $inputs");
+        map.get(69).add("$wf_body_element = $outputs");
+        map.get(69).add("$wf_body_element = $scatter");
+        map.get(69).add("$wf_body_element = $wf_meta");
+        map.get(69).add("$wf_body_element = $wf_parameter_meta");
+        map.get(71).add("$wf_meta = :meta $meta_map -> Meta( map=$1 )");
+        map.get(119).add("$wf_parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
+        map.get(141).add("$workflow = :workflow :identifier :lbrace $_gen15 :rbrace -> Workflow( name=$1, body=$3 )");
         nonterminal_rules = Collections.unmodifiableMap(map);
     }
     static {
@@ -2644,9 +2648,9 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
         map.put(new Integer(94), "$_gen21 = list($meta_value, :comma)");
         map.put(new Integer(96), "$_gen22 = list($meta_kv, :comma)");
         map.put(new Integer(98), "$_gen23 = list($type_e, :comma)");
-        map.put(new Integer(120), "$_gen24 = list($e, :comma)");
-        map.put(new Integer(124), "$_gen25 = list($object_kv, :comma)");
-        map.put(new Integer(127), "$_gen26 = list($map_kv, :comma)");
+        map.put(new Integer(120), "$_gen24 = list($object_kv, :comma)");
+        map.put(new Integer(122), "$_gen25 = list($e, :comma)");
+        map.put(new Integer(128), "$_gen26 = list($map_kv, :comma)");
         map.put(new Integer(10), "$_gen3 = list($static_string_piece)");
         map.put(new Integer(12), "$_gen4 = list($string_piece)");
         map.put(new Integer(18), "$_gen5 = $import_namespace");
@@ -2678,22 +2682,23 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
         map.put(new Integer(116), "$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )");
         map.put(new Integer(112), "$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )");
         map.put(new Integer(115), "$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )");
-        map.put(new Integer(123), "$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
-        map.put(new Integer(122), "$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
-        map.put(new Integer(131), "$e = $string_literal");
-        map.put(new Integer(133), "$e = :boolean");
+        map.put(new Integer(125), "$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
+        map.put(new Integer(124), "$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
+        map.put(new Integer(132), "$e = $string_literal");
+        map.put(new Integer(134), "$e = :boolean");
         map.put(new Integer(119), "$e = :dash $e -> UnaryNegation( expression=$1 )");
-        map.put(new Integer(135), "$e = :float");
-        map.put(new Integer(132), "$e = :identifier");
-        map.put(new Integer(121), "$e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 )");
-        map.put(new Integer(130), "$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
-        map.put(new Integer(134), "$e = :integer");
-        map.put(new Integer(128), "$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
-        map.put(new Integer(129), "$e = :lparen $_gen24 :rparen -> TupleLiteral( values=$1 )");
-        map.put(new Integer(126), "$e = :lsquare $_gen24 :rsquare -> ArrayLiteral( values=$1 )");
-        map.put(new Integer(136), "$e = :none");
+        map.put(new Integer(136), "$e = :float");
+        map.put(new Integer(133), "$e = :identifier");
+        map.put(new Integer(121), "$e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 )");
+        map.put(new Integer(123), "$e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 )");
+        map.put(new Integer(131), "$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
+        map.put(new Integer(135), "$e = :integer");
+        map.put(new Integer(129), "$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
+        map.put(new Integer(130), "$e = :lparen $_gen25 :rparen -> TupleLiteral( values=$1 )");
+        map.put(new Integer(127), "$e = :lsquare $_gen25 :rsquare -> ArrayLiteral( values=$1 )");
+        map.put(new Integer(137), "$e = :none");
         map.put(new Integer(117), "$e = :not $e -> LogicalNot( expression=$1 )");
-        map.put(new Integer(125), "$e = :object :lbrace $_gen25 :rbrace -> ObjectLiteral( map=$2 )");
+        map.put(new Integer(126), "$e = :object :lbrace $_gen24 :rbrace -> ObjectLiteral( map=$2 )");
         map.put(new Integer(118), "$e = :plus $e -> UnaryPlus( expression=$1 )");
         map.put(new Integer(38), "$expression_placeholder = :expression_placeholder_start $_gen9 $e :expression_placeholder_end -> ExpressionPlaceholder( attributes=$1, expr=$2 )");
         map.put(new Integer(39), "$expression_placeholder_kv = :cmd_attr_hint :identifier :equal $e -> ExpressionPlaceholderAttr( key=$1, value=$3 )");
@@ -2803,29 +2808,30 @@ private static Terminal expect(ParserContext ctx, TerminalIdentifier expecting)
     private static Map<Integer, Integer> prefix_binding_power_e;
     static {
         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
-        map.put(45, 4000); /* $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) */
-        map.put(29, 5000); /* $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) */
-        map.put(53, 6000); /* $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) */
-        map.put(51, 6000); /* $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) */
-        map.put(36, 7000); /* $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) */
-        map.put(40, 7000); /* $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) */
-        map.put(2, 7000); /* $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) */
-        map.put(52, 7000); /* $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) */
-        map.put(33, 8000); /* $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) */
-        map.put(32, 8000); /* $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) */
-        map.put(18, 9000); /* $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) */
-        map.put(37, 9000); /* $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) */
-        map.put(64, 9000); /* $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) */
-        map.put(15, 11000); /* $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall( name=$0, params=$2 ) */
-        map.put(17, 12000); /* $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) */
-        map.put(42, 13000); /* $e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 ) */
+        map.put(40, 4000); /* $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) */
+        map.put(63, 5000); /* $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) */
+        map.put(56, 6000); /* $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) */
+        map.put(20, 6000); /* $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) */
+        map.put(57, 7000); /* $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) */
+        map.put(48, 7000); /* $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) */
+        map.put(18, 7000); /* $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) */
+        map.put(34, 7000); /* $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) */
+        map.put(59, 8000); /* $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) */
+        map.put(42, 8000); /* $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) */
+        map.put(21, 9000); /* $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) */
+        map.put(30, 9000); /* $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) */
+        map.put(6, 9000); /* $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) */
+        map.put(3, 11000); /* $e = :identifier <=> :lbrace list($object_kv, :comma) :rbrace -> StructLiteral( name=$0, map=$2 ) */
+        map.put(64, 12000); /* $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall( name=$0, params=$2 ) */
+        map.put(39, 13000); /* $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) */
+        map.put(45, 14000); /* $e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 ) */
         infix_binding_power_e = Collections.unmodifiableMap(map);
     }
     static {
         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
-        map.put(12, 10000); /* $e = :not $e -> LogicalNot( expression=$1 ) */
-        map.put(33, 10000); /* $e = :plus $e -> UnaryPlus( expression=$1 ) */
-        map.put(32, 10000); /* $e = :dash $e -> UnaryNegation( expression=$1 ) */
+        map.put(43, 10000); /* $e = :not $e -> LogicalNot( expression=$1 ) */
+        map.put(59, 10000); /* $e = :plus $e -> UnaryPlus( expression=$1 ) */
+        map.put(42, 10000); /* $e = :dash $e -> UnaryNegation( expression=$1 ) */
         prefix_binding_power_e = Collections.unmodifiableMap(map);
     }
     static int get_infix_binding_power_e(int terminal_id) {
@@ -2862,7 +2868,7 @@ public static ParseTree parse_e_internal(ParserContext ctx, int rbp) throws Synt
         return left;
     }
     private static ParseTree nud_e(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(107, "e") );
+        ParseTree tree = new ParseTree( new NonTerminal(79, "e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "e";
         if (current == null) {
@@ -2876,7 +2882,7 @@ else if (rule_first.get(117).contains(terminal_map.get(current.getId()))) {
             tree.setAstTransformation(new AstTransformNodeCreator("LogicalNot", parameters));
             tree.setNudMorphemeCount(2);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_NOT));
-            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(12)));
+            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(43)));
             tree.setPrefix(true);
         }
         else if (rule_first.get(118).contains(terminal_map.get(current.getId()))) {
@@ -2887,7 +2893,7 @@ else if (rule_first.get(118).contains(terminal_map.get(current.getId()))) {
             tree.setAstTransformation(new AstTransformNodeCreator("UnaryPlus", parameters));
             tree.setNudMorphemeCount(2);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_PLUS));
-            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(33)));
+            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(59)));
             tree.setPrefix(true);
         }
         else if (rule_first.get(119).contains(terminal_map.get(current.getId()))) {
@@ -2898,42 +2904,49 @@ else if (rule_first.get(119).contains(terminal_map.get(current.getId()))) {
             tree.setAstTransformation(new AstTransformNodeCreator("UnaryNegation", parameters));
             tree.setNudMorphemeCount(2);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DASH));
-            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(32)));
+            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(42)));
             tree.setPrefix(true);
         }
         else if (rule_first.get(121).contains(terminal_map.get(current.getId()))) {
-            /* (121) $e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 ) */
+            /* (121) $e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 ) */
             ctx.rule = rules.get(121);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
         }
-        else if (rule_first.get(125).contains(terminal_map.get(current.getId()))) {
-            /* (125) $e = :object :lbrace $_gen25 :rbrace -> ObjectLiteral( map=$2 ) */
-            ctx.rule = rules.get(125);
+        else if (rule_first.get(123).contains(terminal_map.get(current.getId()))) {
+            /* (123) $e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 ) */
+            ctx.rule = rules.get(123);
+            tree.setAstTransformation(new AstTransformSubstitution(0));
+            tree.setNudMorphemeCount(1);
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
+        }
+        else if (rule_first.get(126).contains(terminal_map.get(current.getId()))) {
+            /* (126) $e = :object :lbrace $_gen24 :rbrace -> ObjectLiteral( map=$2 ) */
+            ctx.rule = rules.get(126);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("map", 2);
             tree.setAstTransformation(new AstTransformNodeCreator("ObjectLiteral", parameters));
             tree.setNudMorphemeCount(4);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_OBJECT));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LBRACE));
-            tree.add(parse__gen25(ctx));
+            tree.add(parse__gen24(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RBRACE));
         }
-        else if (rule_first.get(126).contains(terminal_map.get(current.getId()))) {
-            /* (126) $e = :lsquare $_gen24 :rsquare -> ArrayLiteral( values=$1 ) */
-            ctx.rule = rules.get(126);
+        else if (rule_first.get(127).contains(terminal_map.get(current.getId()))) {
+            /* (127) $e = :lsquare $_gen25 :rsquare -> ArrayLiteral( values=$1 ) */
+            ctx.rule = rules.get(127);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("values", 1);
             tree.setAstTransformation(new AstTransformNodeCreator("ArrayLiteral", parameters));
             tree.setNudMorphemeCount(3);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LSQUARE));
-            tree.add(parse__gen24(ctx));
+            tree.add(parse__gen25(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RSQUARE));
         }
-        else if (rule_first.get(128).contains(terminal_map.get(current.getId()))) {
-            /* (128) $e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 ) */
-            ctx.rule = rules.get(128);
+        else if (rule_first.get(129).contains(terminal_map.get(current.getId()))) {
+            /* (129) $e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 ) */
+            ctx.rule = rules.get(129);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("map", 1);
             tree.setAstTransformation(new AstTransformNodeCreator("MapLiteral", parameters));
@@ -2942,20 +2955,20 @@ else if (rule_first.get(128).contains(terminal_map.get(current.getId()))) {
             tree.add(parse__gen26(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RBRACE));
         }
-        else if (rule_first.get(129).contains(terminal_map.get(current.getId()))) {
-            /* (129) $e = :lparen $_gen24 :rparen -> TupleLiteral( values=$1 ) */
-            ctx.rule = rules.get(129);
+        else if (rule_first.get(130).contains(terminal_map.get(current.getId()))) {
+            /* (130) $e = :lparen $_gen25 :rparen -> TupleLiteral( values=$1 ) */
+            ctx.rule = rules.get(130);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("values", 1);
             tree.setAstTransformation(new AstTransformNodeCreator("TupleLiteral", parameters));
             tree.setNudMorphemeCount(3);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LPAREN));
-            tree.add(parse__gen24(ctx));
+            tree.add(parse__gen25(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RPAREN));
         }
-        else if (rule_first.get(130).contains(terminal_map.get(current.getId()))) {
-            /* (130) $e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 ) */
-            ctx.rule = rules.get(130);
+        else if (rule_first.get(131).contains(terminal_map.get(current.getId()))) {
+            /* (131) $e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 ) */
+            ctx.rule = rules.get(131);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("cond", 1);
             parameters.put("iftrue", 3);
@@ -2969,56 +2982,56 @@ else if (rule_first.get(130).contains(terminal_map.get(current.getId()))) {
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_ELSE));
             tree.add(parse_e(ctx));
         }
-        else if (rule_first.get(131).contains(terminal_map.get(current.getId()))) {
-            /* (131) $e = $string_literal */
-            ctx.rule = rules.get(131);
-            tree.setAstTransformation(new AstTransformSubstitution(0));
-            tree.setNudMorphemeCount(1);
-            tree.add(parse_string_literal(ctx));
-        }
         else if (rule_first.get(132).contains(terminal_map.get(current.getId()))) {
-            /* (132) $e = :identifier */
+            /* (132) $e = $string_literal */
             ctx.rule = rules.get(132);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
+            tree.add(parse_string_literal(ctx));
         }
         else if (rule_first.get(133).contains(terminal_map.get(current.getId()))) {
-            /* (133) $e = :boolean */
+            /* (133) $e = :identifier */
             ctx.rule = rules.get(133);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_BOOLEAN));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
         }
         else if (rule_first.get(134).contains(terminal_map.get(current.getId()))) {
-            /* (134) $e = :integer */
+            /* (134) $e = :boolean */
             ctx.rule = rules.get(134);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_INTEGER));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_BOOLEAN));
         }
         else if (rule_first.get(135).contains(terminal_map.get(current.getId()))) {
-            /* (135) $e = :float */
+            /* (135) $e = :integer */
             ctx.rule = rules.get(135);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_FLOAT));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_INTEGER));
         }
         else if (rule_first.get(136).contains(terminal_map.get(current.getId()))) {
-            /* (136) $e = :none */
+            /* (136) $e = :float */
             ctx.rule = rules.get(136);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_FLOAT));
+        }
+        else if (rule_first.get(137).contains(terminal_map.get(current.getId()))) {
+            /* (137) $e = :none */
+            ctx.rule = rules.get(137);
+            tree.setAstTransformation(new AstTransformSubstitution(0));
+            tree.setNudMorphemeCount(1);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_NONE));
         }
         return tree;
     }
     private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(107, "e") );
+        ParseTree tree = new ParseTree( new NonTerminal(79, "e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "e";
         int modifier;
-        if (current.getId() == 45) {
+        if (current.getId() == 40) {
             /* $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(104);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3030,10 +3043,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DOUBLE_PIPE));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(45) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(40) - modifier));
             return tree;
         }
-        if (current.getId() == 29) {
+        if (current.getId() == 63) {
             /* $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(105);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3045,10 +3058,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DOUBLE_AMPERSAND));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(29) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(63) - modifier));
             return tree;
         }
-        if (current.getId() == 53) {
+        if (current.getId() == 56) {
             /* $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(106);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3060,10 +3073,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DOUBLE_EQUAL));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(53) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(56) - modifier));
             return tree;
         }
-        if (current.getId() == 51) {
+        if (current.getId() == 20) {
             /* $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(107);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3075,10 +3088,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_NOT_EQUAL));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(51) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(20) - modifier));
             return tree;
         }
-        if (current.getId() == 36) {
+        if (current.getId() == 57) {
             /* $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(108);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3090,10 +3103,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LT));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(36) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(57) - modifier));
             return tree;
         }
-        if (current.getId() == 40) {
+        if (current.getId() == 48) {
             /* $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(109);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3105,10 +3118,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LTEQ));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(40) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(48) - modifier));
             return tree;
         }
-        if (current.getId() == 2) {
+        if (current.getId() == 18) {
             /* $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(110);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3120,10 +3133,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_GT));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(2) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(18) - modifier));
             return tree;
         }
-        if (current.getId() == 52) {
+        if (current.getId() == 34) {
             /* $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(111);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3135,10 +3148,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_GTEQ));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(52) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(34) - modifier));
             return tree;
         }
-        if (current.getId() == 33) {
+        if (current.getId() == 59) {
             /* $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(112);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3150,10 +3163,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_PLUS));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(33) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(59) - modifier));
             return tree;
         }
-        if (current.getId() == 32) {
+        if (current.getId() == 42) {
             /* $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(113);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3165,10 +3178,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DASH));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(32) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(42) - modifier));
             return tree;
         }
-        if (current.getId() == 18) {
+        if (current.getId() == 21) {
             /* $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(114);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3180,10 +3193,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_ASTERISK));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(18) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(21) - modifier));
             return tree;
         }
-        if (current.getId() == 37) {
+        if (current.getId() == 30) {
             /* $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(115);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3195,10 +3208,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_SLASH));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(37) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(30) - modifier));
             return tree;
         }
-        if (current.getId() == 64) {
+        if (current.getId() == 6) {
             /* $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(116);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3210,25 +3223,38 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_PERCENT));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(64) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(6) - modifier));
             return tree;
         }
-        if (current.getId() == 15) {
-            /* $e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 ) */
+        if (current.getId() == 3) {
+            /* $e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 ) */
             ctx.rule = rules.get(121);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("name", 0);
+            parameters.put("map", 2);
+            tree.setAstTransformation(new AstTransformNodeCreator("StructLiteral", parameters));
+            tree.add(left);
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LBRACE));
+            tree.add(parse__gen24(ctx));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RBRACE));
+            return tree;
+        }
+        if (current.getId() == 64) {
+            /* $e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 ) */
+            ctx.rule = rules.get(123);
+            LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
+            parameters.put("name", 0);
             parameters.put("params", 2);
             tree.setAstTransformation(new AstTransformNodeCreator("FunctionCall", parameters));
             tree.add(left);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LPAREN));
-            tree.add(parse__gen24(ctx));
+            tree.add(parse__gen25(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RPAREN));
             return tree;
         }
-        if (current.getId() == 17) {
+        if (current.getId() == 39) {
             /* $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) */
-            ctx.rule = rules.get(122);
+            ctx.rule = rules.get(124);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("lhs", 0);
             parameters.put("rhs", 2);
@@ -3237,13 +3263,13 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(left);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LSQUARE));
             modifier = 0;
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(17) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(39) - modifier));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RSQUARE));
             return tree;
         }
-        if (current.getId() == 42) {
+        if (current.getId() == 45) {
             /* $e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 ) */
-            ctx.rule = rules.get(123);
+            ctx.rule = rules.get(125);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("value", 0);
             parameters.put("member", 2);
@@ -3300,7 +3326,7 @@ public static ParseTree parse_meta_value_internal(ParserContext ctx, int rbp) th
         return left;
     }
     private static ParseTree nud_meta_value(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(120, "meta_value") );
+        ParseTree tree = new ParseTree( new NonTerminal(135, "meta_value") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "meta_value";
         if (current == null) {
@@ -3366,7 +3392,7 @@ else if (rule_first.get(97).contains(terminal_map.get(current.getId()))) {
         return tree;
     }
     private static ParseTree led_meta_value(ParseTree left, ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(120, "meta_value") );
+        ParseTree tree = new ParseTree( new NonTerminal(135, "meta_value") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "meta_value";
         int modifier;
@@ -3376,9 +3402,9 @@ private static ParseTree led_meta_value(ParseTree left, ParserContext ctx) throw
     private static Map<Integer, Integer> prefix_binding_power_type_e;
     static {
         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
-        map.put(17, 1000); /* $type_e = :type <=> :lsquare list($type_e, :comma) :rsquare -> Type( name=$0, subtype=$2 ) */
-        map.put(21, 2000); /* $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) */
-        map.put(33, 3000); /* $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) */
+        map.put(39, 1000); /* $type_e = :type <=> :lsquare list($type_e, :comma) :rsquare -> Type( name=$0, subtype=$2 ) */
+        map.put(1, 2000); /* $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) */
+        map.put(59, 3000); /* $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) */
         infix_binding_power_type_e = Collections.unmodifiableMap(map);
     }
     static {
@@ -3419,7 +3445,7 @@ public static ParseTree parse_type_e_internal(ParserContext ctx, int rbp) throws
         return left;
     }
     private static ParseTree nud_type_e(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(67, "type_e") );
+        ParseTree tree = new ParseTree( new NonTerminal(140, "type_e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "type_e";
         if (current == null) {
@@ -3463,11 +3489,11 @@ else if (rule_first.get(103).contains(terminal_map.get(current.getId()))) {
         return tree;
     }
     private static ParseTree led_type_e(ParseTree left, ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(67, "type_e") );
+        ParseTree tree = new ParseTree( new NonTerminal(140, "type_e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "type_e";
         int modifier;
-        if (current.getId() == 17) {
+        if (current.getId() == 39) {
             /* $type_e = :type <=> :lsquare $_gen23 :rsquare -> Type( name=$0, subtype=$2 ) */
             ctx.rule = rules.get(99);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3480,7 +3506,7 @@ private static ParseTree led_type_e(ParseTree left, ParserContext ctx) throws Sy
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RSQUARE));
             return tree;
         }
-        if (current.getId() == 21) {
+        if (current.getId() == 1) {
             /* $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) */
             ctx.rule = rules.get(100);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3490,7 +3516,7 @@ private static ParseTree led_type_e(ParseTree left, ParserContext ctx) throws Sy
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_QMARK));
             return tree;
         }
-        if (current.getId() == 33) {
+        if (current.getId() == 59) {
             /* $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) */
             ctx.rule = rules.get(101);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3507,12 +3533,12 @@ public ParseTree parse__gen0(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen0(ctx);
     }
     private static ParseTree parse__gen0(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(75, "_gen0"));
+        ParseTree tree = new ParseTree(new NonTerminal(82, "_gen0"));
         tree.setList(true);
         ctx.nonterminal = "_gen0";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(75).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(75).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(82).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(82).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3521,7 +3547,7 @@ private static ParseTree parse__gen0(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(75).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(82).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_import(ctx));
             ctx.nonterminal = "_gen0"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3533,12 +3559,12 @@ public ParseTree parse__gen1(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen1(ctx);
     }
     private static ParseTree parse__gen1(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(128, "_gen1"));
+        ParseTree tree = new ParseTree(new NonTerminal(90, "_gen1"));
         tree.setList(true);
         ctx.nonterminal = "_gen1";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(128).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(128).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(90).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(90).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3547,7 +3573,7 @@ private static ParseTree parse__gen1(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(128).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(90).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_file_body_element(ctx));
             ctx.nonterminal = "_gen1"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3559,12 +3585,12 @@ public ParseTree parse__gen10(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen10(ctx);
     }
     private static ParseTree parse__gen10(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(115, "_gen10"));
+        ParseTree tree = new ParseTree(new NonTerminal(68, "_gen10"));
         tree.setList(true);
         ctx.nonterminal = "_gen10";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(115).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(115).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(68).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(68).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3573,7 +3599,7 @@ private static ParseTree parse__gen10(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(115).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(68).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_input_declaration(ctx));
             ctx.nonterminal = "_gen10"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3585,12 +3611,12 @@ public ParseTree parse__gen11(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen11(ctx);
     }
     private static ParseTree parse__gen11(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(68, "_gen11"));
+        ParseTree tree = new ParseTree(new NonTerminal(101, "_gen11"));
         tree.setList(true);
         ctx.nonterminal = "_gen11";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(68).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(68).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(101).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(101).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3599,7 +3625,7 @@ private static ParseTree parse__gen11(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(68).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(101).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_kv(ctx));
             ctx.nonterminal = "_gen11"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3611,12 +3637,12 @@ public ParseTree parse__gen12(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen12(ctx);
     }
     private static ParseTree parse__gen12(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(76, "_gen12"));
+        ParseTree tree = new ParseTree(new NonTerminal(86, "_gen12"));
         tree.setList(true);
         ctx.nonterminal = "_gen12";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(76).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(76).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(86).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(86).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3625,7 +3651,7 @@ private static ParseTree parse__gen12(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(76).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(86).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_meta_kv(ctx));
             ctx.nonterminal = "_gen12"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3637,12 +3663,12 @@ public ParseTree parse__gen14(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen14(ctx);
     }
     private static ParseTree parse__gen14(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(89, "_gen14"));
+        ParseTree tree = new ParseTree(new NonTerminal(129, "_gen14"));
         tree.setList(true);
         ctx.nonterminal = "_gen14";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(89).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(89).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(129).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(129).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3651,7 +3677,7 @@ private static ParseTree parse__gen14(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(89).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(129).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_output_kv(ctx));
             ctx.nonterminal = "_gen14"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3663,12 +3689,12 @@ public ParseTree parse__gen15(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen15(ctx);
     }
     private static ParseTree parse__gen15(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(132, "_gen15"));
+        ParseTree tree = new ParseTree(new NonTerminal(115, "_gen15"));
         tree.setList(true);
         ctx.nonterminal = "_gen15";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(132).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(132).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(115).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(115).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3677,7 +3703,7 @@ private static ParseTree parse__gen15(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(132).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(115).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_wf_body_element(ctx));
             ctx.nonterminal = "_gen15"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3689,12 +3715,12 @@ public ParseTree parse__gen17(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen17(ctx);
     }
     private static ParseTree parse__gen17(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(95, "_gen17"));
+        ParseTree tree = new ParseTree(new NonTerminal(132, "_gen17"));
         tree.setList(true);
         ctx.nonterminal = "_gen17";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(95).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(95).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(132).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(132).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3703,7 +3729,7 @@ private static ParseTree parse__gen17(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(95).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(132).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_call_after(ctx));
             ctx.nonterminal = "_gen17"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3715,12 +3741,12 @@ public ParseTree parse__gen2(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen2(ctx);
     }
     private static ParseTree parse__gen2(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(129, "_gen2"));
+        ParseTree tree = new ParseTree(new NonTerminal(136, "_gen2"));
         tree.setList(true);
         ctx.nonterminal = "_gen2";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(129).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(129).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(136).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(136).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3729,7 +3755,7 @@ private static ParseTree parse__gen2(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(129).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(136).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_struct_declaration(ctx));
             ctx.nonterminal = "_gen2"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3741,13 +3767,13 @@ public ParseTree parse__gen20(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen20(ctx);
     }
     private static ParseTree parse__gen20(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(87, "_gen20"));
+        ParseTree tree = new ParseTree(new NonTerminal(131, "_gen20"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen20";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(87).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(87).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(131).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(131).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3756,7 +3782,7 @@ private static ParseTree parse__gen20(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(87).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(131).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_input_kv(ctx));
             ctx.nonterminal = "_gen20"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3782,13 +3808,13 @@ public ParseTree parse__gen21(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen21(ctx);
     }
     private static ParseTree parse__gen21(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(91, "_gen21"));
+        ParseTree tree = new ParseTree(new NonTerminal(102, "_gen21"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen21";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(91).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(91).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(102).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(102).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3797,7 +3823,7 @@ private static ParseTree parse__gen21(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(91).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(102).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_meta_value(ctx));
             ctx.nonterminal = "_gen21"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3823,13 +3849,13 @@ public ParseTree parse__gen22(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen22(ctx);
     }
     private static ParseTree parse__gen22(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(110, "_gen22"));
+        ParseTree tree = new ParseTree(new NonTerminal(109, "_gen22"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen22";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(110).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(110).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3838,7 +3864,7 @@ private static ParseTree parse__gen22(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(110).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_meta_kv(ctx));
             ctx.nonterminal = "_gen22"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3864,13 +3890,13 @@ public ParseTree parse__gen23(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen23(ctx);
     }
     private static ParseTree parse__gen23(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(70, "_gen23"));
+        ParseTree tree = new ParseTree(new NonTerminal(125, "_gen23"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen23";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(70).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(70).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(125).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(125).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3879,7 +3905,7 @@ private static ParseTree parse__gen23(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(70).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(125).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_type_e(ctx));
             ctx.nonterminal = "_gen23"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3905,13 +3931,13 @@ public ParseTree parse__gen24(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen24(ctx);
     }
     private static ParseTree parse__gen24(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(108, "_gen24"));
+        ParseTree tree = new ParseTree(new NonTerminal(80, "_gen24"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen24";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(108).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(108).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(80).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(80).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3920,8 +3946,8 @@ private static ParseTree parse__gen24(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(108).contains(terminal_map.get(ctx.tokens.current().getId())))) {
-            tree.add(parse_e(ctx));
+               nonterminal_first.get(80).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+            tree.add(parse_object_kv(ctx));
             ctx.nonterminal = "_gen24"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
                 ctx.tokens.current().getId() == WdlTerminalIdentifier.TERMINAL_COMMA.id()) {
@@ -3946,13 +3972,13 @@ public ParseTree parse__gen25(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen25(ctx);
     }
     private static ParseTree parse__gen25(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(135, "_gen25"));
+        ParseTree tree = new ParseTree(new NonTerminal(76, "_gen25"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen25";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(135).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(135).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(76).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(76).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3961,8 +3987,8 @@ private static ParseTree parse__gen25(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(135).contains(terminal_map.get(ctx.tokens.current().getId())))) {
-            tree.add(parse_object_kv(ctx));
+               nonterminal_first.get(76).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+            tree.add(parse_e(ctx));
             ctx.nonterminal = "_gen25"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
                 ctx.tokens.current().getId() == WdlTerminalIdentifier.TERMINAL_COMMA.id()) {
@@ -3987,13 +4013,13 @@ public ParseTree parse__gen26(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen26(ctx);
     }
     private static ParseTree parse__gen26(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(119, "_gen26"));
+        ParseTree tree = new ParseTree(new NonTerminal(108, "_gen26"));
         tree.setList(true);
-        tree.setListSeparator(19);
+        tree.setListSeparator(46);
         ctx.nonterminal = "_gen26";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(119).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(119).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(108).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(108).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4002,7 +4028,7 @@ private static ParseTree parse__gen26(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(119).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(108).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_map_kv(ctx));
             ctx.nonterminal = "_gen26"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -4028,12 +4054,12 @@ public ParseTree parse__gen3(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen3(ctx);
     }
     private static ParseTree parse__gen3(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(92, "_gen3"));
+        ParseTree tree = new ParseTree(new NonTerminal(139, "_gen3"));
         tree.setList(true);
         ctx.nonterminal = "_gen3";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(92).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(92).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(139).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(139).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4042,7 +4068,7 @@ private static ParseTree parse__gen3(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(92).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(139).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_static_string_piece(ctx));
             ctx.nonterminal = "_gen3"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4054,12 +4080,12 @@ public ParseTree parse__gen4(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen4(ctx);
     }
     private static ParseTree parse__gen4(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(114, "_gen4"));
+        ParseTree tree = new ParseTree(new NonTerminal(70, "_gen4"));
         tree.setList(true);
         ctx.nonterminal = "_gen4";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(114).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(114).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(70).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(70).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4068,7 +4094,7 @@ private static ParseTree parse__gen4(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(114).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(70).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_string_piece(ctx));
             ctx.nonterminal = "_gen4"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4080,12 +4106,12 @@ public ParseTree parse__gen6(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen6(ctx);
     }
     private static ParseTree parse__gen6(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(102, "_gen6"));
+        ParseTree tree = new ParseTree(new NonTerminal(83, "_gen6"));
         tree.setList(true);
         ctx.nonterminal = "_gen6";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(102).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(102).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(83).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(83).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4094,7 +4120,7 @@ private static ParseTree parse__gen6(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(102).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(83).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_import_alias(ctx));
             ctx.nonterminal = "_gen6"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4106,12 +4132,12 @@ public ParseTree parse__gen7(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen7(ctx);
     }
     private static ParseTree parse__gen7(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(104, "_gen7"));
+        ParseTree tree = new ParseTree(new NonTerminal(88, "_gen7"));
         tree.setList(true);
         ctx.nonterminal = "_gen7";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(104).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(104).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(88).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(88).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4120,7 +4146,7 @@ private static ParseTree parse__gen7(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(104).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(88).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_task_sections(ctx));
             ctx.nonterminal = "_gen7"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4132,12 +4158,12 @@ public ParseTree parse__gen8(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen8(ctx);
     }
     private static ParseTree parse__gen8(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(140, "_gen8"));
+        ParseTree tree = new ParseTree(new NonTerminal(126, "_gen8"));
         tree.setList(true);
         ctx.nonterminal = "_gen8";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(140).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(140).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(126).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(126).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4146,7 +4172,7 @@ private static ParseTree parse__gen8(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(140).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(126).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_command_part(ctx));
             ctx.nonterminal = "_gen8"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4158,12 +4184,12 @@ public ParseTree parse__gen9(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen9(ctx);
     }
     private static ParseTree parse__gen9(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(109, "_gen9"));
+        ParseTree tree = new ParseTree(new NonTerminal(104, "_gen9"));
         tree.setList(true);
         ctx.nonterminal = "_gen9";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(104).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(104).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4172,7 +4198,7 @@ private static ParseTree parse__gen9(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(104).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_expression_placeholder_kv(ctx));
             ctx.nonterminal = "_gen9"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4187,12 +4213,12 @@ private static ParseTree parse__gen13(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[50][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(117, "_gen13"));
+        int rule = (current != null) ? table[8][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(75, "_gen13"));
         ctx.nonterminal = "_gen13";
         if ( current != null &&
-             !nonterminal_first.get(117).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(117).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(75).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(75).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4216,12 +4242,12 @@ private static ParseTree parse__gen16(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[12][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(79, "_gen16"));
+        int rule = (current != null) ? table[36][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(103, "_gen16"));
         ctx.nonterminal = "_gen16";
         if ( current != null &&
-             !nonterminal_first.get(79).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(79).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(103).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(103).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4245,12 +4271,12 @@ private static ParseTree parse__gen18(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[14][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(81, "_gen18"));
+        int rule = (current != null) ? table[22][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(89, "_gen18"));
         ctx.nonterminal = "_gen18";
         if ( current != null &&
-             !nonterminal_first.get(81).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(81).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(89).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(89).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4274,12 +4300,12 @@ private static ParseTree parse__gen19(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[21][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(88, "_gen19"));
+        int rule = (current != null) ? table[6][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(73, "_gen19"));
         ctx.nonterminal = "_gen19";
         if ( current != null &&
-             !nonterminal_first.get(88).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(88).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(73).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(73).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4303,12 +4329,12 @@ private static ParseTree parse__gen5(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[64][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(131, "_gen5"));
+        int rule = (current != null) ? table[33][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(100, "_gen5"));
         ctx.nonterminal = "_gen5";
         if ( current != null &&
-             !nonterminal_first.get(131).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(131).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(100).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(100).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4332,14 +4358,14 @@ private static ParseTree parse_alias(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[59][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(126, "alias"));
+        int rule = (current != null) ? table[63][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(130, "alias"));
         ctx.nonterminal = "alias";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "alias",
-                nonterminal_first.get(126),
-                nonterminal_rules.get(126)
+                nonterminal_first.get(130),
+                nonterminal_rules.get(130)
             ));
         }
         if (rule == 81) {
@@ -4355,7 +4381,7 @@ private static ParseTree parse_alias(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "alias",
             current,
-            nonterminal_first.get(126),
+            nonterminal_first.get(130),
             rules.get(81)
         ));
     }
@@ -4367,14 +4393,14 @@ private static ParseTree parse_call(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[57][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(124, "call"));
+        int rule = (current != null) ? table[70][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(137, "call"));
         ctx.nonterminal = "call";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call",
-                nonterminal_first.get(124),
-                nonterminal_rules.get(124)
+                nonterminal_first.get(137),
+                nonterminal_rules.get(137)
             ));
         }
         if (rule == 75) {
@@ -4401,7 +4427,7 @@ private static ParseTree parse_call(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call",
             current,
-            nonterminal_first.get(124),
+            nonterminal_first.get(137),
             rules.get(75)
         ));
     }
@@ -4413,14 +4439,14 @@ private static ParseTree parse_call_after(ParserContext ctx) throws SyntaxError
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[11][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(78, "call_after"));
+        int rule = (current != null) ? table[60][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(127, "call_after"));
         ctx.nonterminal = "call_after";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call_after",
-                nonterminal_first.get(78),
-                nonterminal_rules.get(78)
+                nonterminal_first.get(127),
+                nonterminal_rules.get(127)
             ));
         }
         if (rule == 82) {
@@ -4436,7 +4462,7 @@ private static ParseTree parse_call_after(ParserContext ctx) throws SyntaxError
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call_after",
             current,
-            nonterminal_first.get(78),
+            nonterminal_first.get(127),
             rules.get(82)
         ));
     }
@@ -4448,14 +4474,14 @@ private static ParseTree parse_call_body(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[19][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(86, "call_body"));
+        int rule = (current != null) ? table[11][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(78, "call_body"));
         ctx.nonterminal = "call_body";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call_body",
-                nonterminal_first.get(86),
-                nonterminal_rules.get(86)
+                nonterminal_first.get(78),
+                nonterminal_rules.get(78)
             ));
         }
         if (rule == 80) {
@@ -4475,7 +4501,7 @@ private static ParseTree parse_call_body(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call_body",
             current,
-            nonterminal_first.get(86),
+            nonterminal_first.get(78),
             rules.get(80)
         ));
     }
@@ -4487,14 +4513,14 @@ private static ParseTree parse_call_brace_block(ParserContext ctx) throws Syntax
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[51][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(118, "call_brace_block"));
+        int rule = (current != null) ? table[50][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(117, "call_brace_block"));
         ctx.nonterminal = "call_brace_block";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call_brace_block",
-                nonterminal_first.get(118),
-                nonterminal_rules.get(118)
+                nonterminal_first.get(117),
+                nonterminal_rules.get(117)
             ));
         }
         if (rule == 78) {
@@ -4512,7 +4538,7 @@ private static ParseTree parse_call_brace_block(ParserContext ctx) throws Syntax
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call_brace_block",
             current,
-            nonterminal_first.get(118),
+            nonterminal_first.get(117),
             rules.get(78)
         ));
     }
@@ -4524,14 +4550,14 @@ private static ParseTree parse_command(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[5][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(72, "command"));
+        int rule = (current != null) ? table[24][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(91, "command"));
         ctx.nonterminal = "command";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "command",
-                nonterminal_first.get(72),
-                nonterminal_rules.get(72)
+                nonterminal_first.get(91),
+                nonterminal_rules.get(91)
             ));
         }
         if (rule == 34) {
@@ -4553,7 +4579,7 @@ private static ParseTree parse_command(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "command",
             current,
-            nonterminal_first.get(72),
+            nonterminal_first.get(91),
             rules.get(34)
         ));
     }
@@ -4565,14 +4591,14 @@ private static ParseTree parse_command_part(ParserContext ctx) throws SyntaxErro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[32][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(99, "command_part"));
+        int rule = (current != null) ? table[28][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(95, "command_part"));
         ctx.nonterminal = "command_part";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "command_part",
-                nonterminal_first.get(99),
-                nonterminal_rules.get(99)
+                nonterminal_first.get(95),
+                nonterminal_rules.get(95)
             ));
         }
         if (rule == 35) {
@@ -4594,7 +4620,7 @@ else if (rule == 36) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "command_part",
             current,
-            nonterminal_first.get(99),
+            nonterminal_first.get(95),
             rules.get(36)
         ));
     }
@@ -4606,14 +4632,14 @@ private static ParseTree parse_declaration(ParserContext ctx) throws SyntaxError
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[26][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(93, "declaration"));
+        int rule = (current != null) ? table[29][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(96, "declaration"));
         ctx.nonterminal = "declaration";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "declaration",
-                nonterminal_first.get(93),
-                nonterminal_rules.get(93)
+                nonterminal_first.get(96),
+                nonterminal_rules.get(96)
             ));
         }
         if (rule == 54) {
@@ -4635,7 +4661,7 @@ private static ParseTree parse_declaration(ParserContext ctx) throws SyntaxError
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "declaration",
             current,
-            nonterminal_first.get(93),
+            nonterminal_first.get(96),
             rules.get(54)
         ));
     }
@@ -4647,14 +4673,14 @@ private static ParseTree parse_document(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[71][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(138, "document"));
+        int rule = (current != null) ? table[30][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(97, "document"));
         ctx.nonterminal = "document";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "document",
-                nonterminal_first.get(138),
-                nonterminal_rules.get(138)
+                nonterminal_first.get(97),
+                nonterminal_rules.get(97)
             ));
         }
         if (rule == 2) {
@@ -4676,7 +4702,7 @@ private static ParseTree parse_document(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "document",
             current,
-            nonterminal_first.get(138),
+            nonterminal_first.get(97),
             rules.get(2)
         ));
     }
@@ -4688,14 +4714,14 @@ private static ParseTree parse_expression_placeholder(ParserContext ctx) throws
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[30][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(97, "expression_placeholder"));
+        int rule = (current != null) ? table[66][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(133, "expression_placeholder"));
         ctx.nonterminal = "expression_placeholder";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "expression_placeholder",
-                nonterminal_first.get(97),
-                nonterminal_rules.get(97)
+                nonterminal_first.get(133),
+                nonterminal_rules.get(133)
             ));
         }
         if (rule == 38) {
@@ -4718,7 +4744,7 @@ private static ParseTree parse_expression_placeholder(ParserContext ctx) throws
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "expression_placeholder",
             current,
-            nonterminal_first.get(97),
+            nonterminal_first.get(133),
             rules.get(38)
         ));
     }
@@ -4730,14 +4756,14 @@ private static ParseTree parse_expression_placeholder_kv(ParserContext ctx) thro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[66][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(133, "expression_placeholder_kv"));
+        int rule = (current != null) ? table[67][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(134, "expression_placeholder_kv"));
         ctx.nonterminal = "expression_placeholder_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "expression_placeholder_kv",
-                nonterminal_first.get(133),
-                nonterminal_rules.get(133)
+                nonterminal_first.get(134),
+                nonterminal_rules.get(134)
             ));
         }
         if (rule == 39) {
@@ -4760,7 +4786,7 @@ private static ParseTree parse_expression_placeholder_kv(ParserContext ctx) thro
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "expression_placeholder_kv",
             current,
-            nonterminal_first.get(133),
+            nonterminal_first.get(134),
             rules.get(39)
         ));
     }
@@ -4772,14 +4798,14 @@ private static ParseTree parse_file_body_element(ParserContext ctx) throws Synta
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[60][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(127, "file_body_element"));
+        int rule = (current != null) ? table[56][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(123, "file_body_element"));
         ctx.nonterminal = "file_body_element";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "file_body_element",
-                nonterminal_first.get(127),
-                nonterminal_rules.get(127)
+                nonterminal_first.get(123),
+                nonterminal_rules.get(123)
             ));
         }
         if (rule == 3) {
@@ -4809,7 +4835,7 @@ else if (rule == 5) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "file_body_element",
             current,
-            nonterminal_first.get(127),
+            nonterminal_first.get(123),
             rules.get(5)
         ));
     }
@@ -4821,14 +4847,14 @@ private static ParseTree parse_if_stmt(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[27][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(94, "if_stmt"));
+        int rule = (current != null) ? table[53][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(120, "if_stmt"));
         ctx.nonterminal = "if_stmt";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "if_stmt",
-                nonterminal_first.get(94),
-                nonterminal_rules.get(94)
+                nonterminal_first.get(120),
+                nonterminal_rules.get(120)
             ));
         }
         if (rule == 85) {
@@ -4857,7 +4883,7 @@ private static ParseTree parse_if_stmt(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "if_stmt",
             current,
-            nonterminal_first.get(94),
+            nonterminal_first.get(120),
             rules.get(85)
         ));
     }
@@ -4869,14 +4895,14 @@ private static ParseTree parse_import(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[15][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(82, "import"));
+        int rule = (current != null) ? table[14][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(81, "import"));
         ctx.nonterminal = "import";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "import",
-                nonterminal_first.get(82),
-                nonterminal_rules.get(82)
+                nonterminal_first.get(81),
+                nonterminal_rules.get(81)
             ));
         }
         if (rule == 21) {
@@ -4900,7 +4926,7 @@ private static ParseTree parse_import(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "import",
             current,
-            nonterminal_first.get(82),
+            nonterminal_first.get(81),
             rules.get(21)
         ));
     }
@@ -4912,14 +4938,14 @@ private static ParseTree parse_import_alias(ParserContext ctx) throws SyntaxErro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[58][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(125, "import_alias"));
+        int rule = (current != null) ? table[18][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(85, "import_alias"));
         ctx.nonterminal = "import_alias";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "import_alias",
-                nonterminal_first.get(125),
-                nonterminal_rules.get(125)
+                nonterminal_first.get(85),
+                nonterminal_rules.get(85)
             ));
         }
         if (rule == 23) {
@@ -4942,7 +4968,7 @@ private static ParseTree parse_import_alias(ParserContext ctx) throws SyntaxErro
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "import_alias",
             current,
-            nonterminal_first.get(125),
+            nonterminal_first.get(85),
             rules.get(23)
         ));
     }
@@ -4954,14 +4980,14 @@ private static ParseTree parse_import_namespace(ParserContext ctx) throws Syntax
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[29][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(96, "import_namespace"));
+        int rule = (current != null) ? table[40][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(107, "import_namespace"));
         ctx.nonterminal = "import_namespace";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "import_namespace",
-                nonterminal_first.get(96),
-                nonterminal_rules.get(96)
+                nonterminal_first.get(107),
+                nonterminal_rules.get(107)
             ));
         }
         if (rule == 22) {
@@ -4977,7 +5003,7 @@ private static ParseTree parse_import_namespace(ParserContext ctx) throws Syntax
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "import_namespace",
             current,
-            nonterminal_first.get(96),
+            nonterminal_first.get(107),
             rules.get(22)
         ));
     }
@@ -4989,14 +5015,14 @@ private static ParseTree parse_input_declaration(ParserContext ctx) throws Synta
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[16][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(83, "input_declaration"));
+        int rule = (current != null) ? table[0][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(67, "input_declaration"));
         ctx.nonterminal = "input_declaration";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "input_declaration",
-                nonterminal_first.get(83),
-                nonterminal_rules.get(83)
+                nonterminal_first.get(67),
+                nonterminal_rules.get(67)
             ));
         }
         if (rule == 53) {
@@ -5018,7 +5044,7 @@ private static ParseTree parse_input_declaration(ParserContext ctx) throws Synta
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "input_declaration",
             current,
-            nonterminal_first.get(83),
+            nonterminal_first.get(67),
             rules.get(53)
         ));
     }
@@ -5030,14 +5056,14 @@ private static ParseTree parse_input_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[55][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(122, "input_kv"));
+        int rule = (current != null) ? table[38][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(105, "input_kv"));
         ctx.nonterminal = "input_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "input_kv",
-                nonterminal_first.get(122),
-                nonterminal_rules.get(122)
+                nonterminal_first.get(105),
+                nonterminal_rules.get(105)
             ));
         }
         if (rule == 88) {
@@ -5058,7 +5084,7 @@ private static ParseTree parse_input_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "input_kv",
             current,
-            nonterminal_first.get(122),
+            nonterminal_first.get(105),
             rules.get(88)
         ));
     }
@@ -5070,14 +5096,14 @@ private static ParseTree parse_inputs(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[39][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(106, "inputs"));
+        int rule = (current != null) ? table[45][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(112, "inputs"));
         ctx.nonterminal = "inputs";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "inputs",
-                nonterminal_first.get(106),
-                nonterminal_rules.get(106)
+                nonterminal_first.get(112),
+                nonterminal_rules.get(112)
             ));
         }
         if (rule == 41) {
@@ -5099,7 +5125,7 @@ private static ParseTree parse_inputs(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "inputs",
             current,
-            nonterminal_first.get(106),
+            nonterminal_first.get(112),
             rules.get(41)
         ));
     }
@@ -5111,14 +5137,14 @@ private static ParseTree parse_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[49][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(116, "kv"));
+        int rule = (current != null) ? table[47][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(114, "kv"));
         ctx.nonterminal = "kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "kv",
-                nonterminal_first.get(116),
-                nonterminal_rules.get(116)
+                nonterminal_first.get(114),
+                nonterminal_rules.get(114)
             ));
         }
         if (rule == 45) {
@@ -5139,7 +5165,7 @@ private static ParseTree parse_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "kv",
             current,
-            nonterminal_first.get(116),
+            nonterminal_first.get(114),
             rules.get(45)
         ));
     }
@@ -5151,14 +5177,14 @@ private static ParseTree parse_map_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[33][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(100, "map_kv"));
+        int rule = (current != null) ? table[57][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(124, "map_kv"));
         ctx.nonterminal = "map_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "map_kv",
-                nonterminal_first.get(100),
-                nonterminal_rules.get(100)
+                nonterminal_first.get(124),
+                nonterminal_rules.get(124)
             ));
         }
         if (rule == 56) {
@@ -5179,7 +5205,7 @@ private static ParseTree parse_map_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "map_kv",
             current,
-            nonterminal_first.get(100),
+            nonterminal_first.get(124),
             rules.get(56)
         ));
     }
@@ -5191,14 +5217,14 @@ private static ParseTree parse_meta(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[69][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(136, "meta"));
+        int rule = (current != null) ? table[39][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(106, "meta"));
         ctx.nonterminal = "meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "meta",
-                nonterminal_first.get(136),
-                nonterminal_rules.get(136)
+                nonterminal_first.get(106),
+                nonterminal_rules.get(106)
             ));
         }
         if (rule == 46) {
@@ -5216,7 +5242,7 @@ private static ParseTree parse_meta(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "meta",
             current,
-            nonterminal_first.get(136),
+            nonterminal_first.get(106),
             rules.get(46)
         ));
     }
@@ -5228,14 +5254,14 @@ private static ParseTree parse_meta_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[45][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(112, "meta_kv"));
+        int rule = (current != null) ? table[26][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(93, "meta_kv"));
         ctx.nonterminal = "meta_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "meta_kv",
-                nonterminal_first.get(112),
-                nonterminal_rules.get(112)
+                nonterminal_first.get(93),
+                nonterminal_rules.get(93)
             ));
         }
         if (rule == 50) {
@@ -5256,7 +5282,7 @@ private static ParseTree parse_meta_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "meta_kv",
             current,
-            nonterminal_first.get(112),
+            nonterminal_first.get(93),
             rules.get(50)
         ));
     }
@@ -5268,14 +5294,14 @@ private static ParseTree parse_meta_map(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[74][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(141, "meta_map"));
+        int rule = (current != null) ? table[10][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(77, "meta_map"));
         ctx.nonterminal = "meta_map";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "meta_map",
-                nonterminal_first.get(141),
-                nonterminal_rules.get(141)
+                nonterminal_first.get(77),
+                nonterminal_rules.get(77)
             ));
         }
         if (rule == 49) {
@@ -5293,7 +5319,7 @@ private static ParseTree parse_meta_map(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "meta_map",
             current,
-            nonterminal_first.get(141),
+            nonterminal_first.get(77),
             rules.get(49)
         ));
     }
@@ -5305,14 +5331,14 @@ private static ParseTree parse_object_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[23][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(90, "object_kv"));
+        int rule = (current != null) ? table[7][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(74, "object_kv"));
         ctx.nonterminal = "object_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "object_kv",
-                nonterminal_first.get(90),
-                nonterminal_rules.get(90)
+                nonterminal_first.get(74),
+                nonterminal_rules.get(74)
             ));
         }
         if (rule == 87) {
@@ -5333,7 +5359,7 @@ private static ParseTree parse_object_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "object_kv",
             current,
-            nonterminal_first.get(90),
+            nonterminal_first.get(74),
             rules.get(87)
         ));
     }
@@ -5345,14 +5371,14 @@ private static ParseTree parse_output_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[10][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(77, "output_kv"));
+        int rule = (current != null) ? table[20][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(87, "output_kv"));
         ctx.nonterminal = "output_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "output_kv",
-                nonterminal_first.get(77),
-                nonterminal_rules.get(77)
+                nonterminal_first.get(87),
+                nonterminal_rules.get(87)
             ));
         }
         if (rule == 59) {
@@ -5376,7 +5402,7 @@ private static ParseTree parse_output_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "output_kv",
             current,
-            nonterminal_first.get(77),
+            nonterminal_first.get(87),
             rules.get(59)
         ));
     }
@@ -5388,14 +5414,14 @@ private static ParseTree parse_outputs(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[17][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(84, "outputs"));
+        int rule = (current != null) ? table[55][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(122, "outputs"));
         ctx.nonterminal = "outputs";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "outputs",
-                nonterminal_first.get(84),
-                nonterminal_rules.get(84)
+                nonterminal_first.get(122),
+                nonterminal_rules.get(122)
             ));
         }
         if (rule == 58) {
@@ -5417,7 +5443,7 @@ private static ParseTree parse_outputs(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "outputs",
             current,
-            nonterminal_first.get(84),
+            nonterminal_first.get(122),
             rules.get(58)
         ));
     }
@@ -5429,14 +5455,14 @@ private static ParseTree parse_parameter_meta(ParserContext ctx) throws SyntaxEr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[38][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(105, "parameter_meta"));
+        int rule = (current != null) ? table[5][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(72, "parameter_meta"));
         ctx.nonterminal = "parameter_meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "parameter_meta",
-                nonterminal_first.get(105),
-                nonterminal_rules.get(105)
+                nonterminal_first.get(72),
+                nonterminal_rules.get(72)
             ));
         }
         if (rule == 47) {
@@ -5454,7 +5480,7 @@ private static ParseTree parse_parameter_meta(ParserContext ctx) throws SyntaxEr
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "parameter_meta",
             current,
-            nonterminal_first.get(105),
+            nonterminal_first.get(72),
             rules.get(47)
         ));
     }
@@ -5466,14 +5492,14 @@ private static ParseTree parse_rt_map(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[18][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(85, "rt_map"));
+        int rule = (current != null) ? table[61][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(128, "rt_map"));
         ctx.nonterminal = "rt_map";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "rt_map",
-                nonterminal_first.get(85),
-                nonterminal_rules.get(85)
+                nonterminal_first.get(128),
+                nonterminal_rules.get(128)
             ));
         }
         if (rule == 44) {
@@ -5491,7 +5517,7 @@ private static ParseTree parse_rt_map(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "rt_map",
             current,
-            nonterminal_first.get(85),
+            nonterminal_first.get(128),
             rules.get(44)
         ));
     }
@@ -5503,14 +5529,14 @@ private static ParseTree parse_runtime(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[13][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(80, "runtime"));
+        int rule = (current != null) ? table[17][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(84, "runtime"));
         ctx.nonterminal = "runtime";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "runtime",
-                nonterminal_first.get(80),
-                nonterminal_rules.get(80)
+                nonterminal_first.get(84),
+                nonterminal_rules.get(84)
             ));
         }
         if (rule == 42) {
@@ -5528,7 +5554,7 @@ private static ParseTree parse_runtime(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "runtime",
             current,
-            nonterminal_first.get(80),
+            nonterminal_first.get(84),
             rules.get(42)
         ));
     }
@@ -5540,14 +5566,14 @@ private static ParseTree parse_scatter(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[54][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(121, "scatter"));
+        int rule = (current != null) ? table[49][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(116, "scatter"));
         ctx.nonterminal = "scatter";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "scatter",
-                nonterminal_first.get(121),
-                nonterminal_rules.get(121)
+                nonterminal_first.get(116),
+                nonterminal_rules.get(116)
             ));
         }
         if (rule == 86) {
@@ -5581,7 +5607,7 @@ private static ParseTree parse_scatter(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "scatter",
             current,
-            nonterminal_first.get(121),
+            nonterminal_first.get(116),
             rules.get(86)
         ));
     }
@@ -5593,14 +5619,14 @@ private static ParseTree parse_setter(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[34][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(101, "setter"));
+        int rule = (current != null) ? table[46][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(113, "setter"));
         ctx.nonterminal = "setter";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "setter",
-                nonterminal_first.get(101),
-                nonterminal_rules.get(101)
+                nonterminal_first.get(113),
+                nonterminal_rules.get(113)
             ));
         }
         if (rule == 55) {
@@ -5616,7 +5642,7 @@ private static ParseTree parse_setter(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "setter",
             current,
-            nonterminal_first.get(101),
+            nonterminal_first.get(113),
             rules.get(55)
         ));
     }
@@ -5628,14 +5654,14 @@ private static ParseTree parse_static_string(ParserContext ctx) throws SyntaxErr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[31][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(98, "static_string"));
+        int rule = (current != null) ? table[32][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(99, "static_string"));
         ctx.nonterminal = "static_string";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "static_string",
-                nonterminal_first.get(98),
-                nonterminal_rules.get(98)
+                nonterminal_first.get(99),
+                nonterminal_rules.get(99)
             ));
         }
         if (rule == 11) {
@@ -5655,7 +5681,7 @@ private static ParseTree parse_static_string(ParserContext ctx) throws SyntaxErr
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "static_string",
             current,
-            nonterminal_first.get(98),
+            nonterminal_first.get(99),
             rules.get(11)
         ));
     }
@@ -5667,14 +5693,14 @@ private static ParseTree parse_static_string_piece(ParserContext ctx) throws Syn
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[2][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(69, "static_string_piece"));
+        int rule = (current != null) ? table[51][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(118, "static_string_piece"));
         ctx.nonterminal = "static_string_piece";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "static_string_piece",
-                nonterminal_first.get(69),
-                nonterminal_rules.get(69)
+                nonterminal_first.get(118),
+                nonterminal_rules.get(118)
             ));
         }
         if (rule == 14) {
@@ -5696,7 +5722,7 @@ else if (rule == 15) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "static_string_piece",
             current,
-            nonterminal_first.get(69),
+            nonterminal_first.get(118),
             rules.get(15)
         ));
     }
@@ -5708,14 +5734,14 @@ private static ParseTree parse_string_literal(ParserContext ctx) throws SyntaxEr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[72][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(139, "string_literal"));
+        int rule = (current != null) ? table[44][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(111, "string_literal"));
         ctx.nonterminal = "string_literal";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "string_literal",
-                nonterminal_first.get(139),
-                nonterminal_rules.get(139)
+                nonterminal_first.get(111),
+                nonterminal_rules.get(111)
             ));
         }
         if (rule == 13) {
@@ -5735,7 +5761,7 @@ private static ParseTree parse_string_literal(ParserContext ctx) throws SyntaxEr
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "string_literal",
             current,
-            nonterminal_first.get(139),
+            nonterminal_first.get(111),
             rules.get(13)
         ));
     }
@@ -5747,14 +5773,14 @@ private static ParseTree parse_string_piece(ParserContext ctx) throws SyntaxErro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[63][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(130, "string_piece"));
+        int rule = (current != null) ? table[25][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(92, "string_piece"));
         ctx.nonterminal = "string_piece";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "string_piece",
-                nonterminal_first.get(130),
-                nonterminal_rules.get(130)
+                nonterminal_first.get(92),
+                nonterminal_rules.get(92)
             ));
         }
         if (rule == 16) {
@@ -5776,7 +5802,7 @@ else if (rule == 17) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "string_piece",
             current,
-            nonterminal_first.get(130),
+            nonterminal_first.get(92),
             rules.get(17)
         ));
     }
@@ -5788,14 +5814,14 @@ private static ParseTree parse_struct(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[7][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(74, "struct"));
+        int rule = (current != null) ? table[27][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(94, "struct"));
         ctx.nonterminal = "struct";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "struct",
-                nonterminal_first.get(74),
-                nonterminal_rules.get(74)
+                nonterminal_first.get(94),
+                nonterminal_rules.get(94)
             ));
         }
         if (rule == 8) {
@@ -5820,7 +5846,7 @@ private static ParseTree parse_struct(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "struct",
             current,
-            nonterminal_first.get(74),
+            nonterminal_first.get(94),
             rules.get(8)
         ));
     }
@@ -5832,14 +5858,14 @@ private static ParseTree parse_struct_declaration(ParserContext ctx) throws Synt
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[6][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(73, "struct_declaration"));
+        int rule = (current != null) ? table[43][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(110, "struct_declaration"));
         ctx.nonterminal = "struct_declaration";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "struct_declaration",
-                nonterminal_first.get(73),
-                nonterminal_rules.get(73)
+                nonterminal_first.get(110),
+                nonterminal_rules.get(110)
             ));
         }
         if (rule == 9) {
@@ -5858,7 +5884,7 @@ private static ParseTree parse_struct_declaration(ParserContext ctx) throws Synt
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "struct_declaration",
             current,
-            nonterminal_first.get(73),
+            nonterminal_first.get(110),
             rules.get(9)
         ));
     }
@@ -5870,14 +5896,14 @@ private static ParseTree parse_task(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[46][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(113, "task"));
+        int rule = (current != null) ? table[71][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(138, "task"));
         ctx.nonterminal = "task";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "task",
-                nonterminal_first.get(113),
-                nonterminal_rules.get(113)
+                nonterminal_first.get(138),
+                nonterminal_rules.get(138)
             ));
         }
         if (rule == 25) {
@@ -5902,7 +5928,7 @@ private static ParseTree parse_task(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "task",
             current,
-            nonterminal_first.get(113),
+            nonterminal_first.get(138),
             rules.get(25)
         ));
     }
@@ -5914,14 +5940,14 @@ private static ParseTree parse_task_sections(ParserContext ctx) throws SyntaxErr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[56][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(123, "task_sections"));
+        int rule = (current != null) ? table[31][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(98, "task_sections"));
         ctx.nonterminal = "task_sections";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "task_sections",
-                nonterminal_first.get(123),
-                nonterminal_rules.get(123)
+                nonterminal_first.get(98),
+                nonterminal_rules.get(98)
             ));
         }
         if (rule == 26) {
@@ -5983,7 +6009,7 @@ else if (rule == 32) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "task_sections",
             current,
-            nonterminal_first.get(123),
+            nonterminal_first.get(98),
             rules.get(32)
         ));
     }
@@ -5995,14 +6021,14 @@ private static ParseTree parse_version(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[4][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(71, "version"));
+        int rule = (current != null) ? table[54][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(121, "version"));
         ctx.nonterminal = "version";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "version",
-                nonterminal_first.get(71),
-                nonterminal_rules.get(71)
+                nonterminal_first.get(121),
+                nonterminal_rules.get(121)
             ));
         }
         if (rule == 6) {
@@ -6020,7 +6046,7 @@ private static ParseTree parse_version(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "version",
             current,
-            nonterminal_first.get(71),
+            nonterminal_first.get(121),
             rules.get(6)
         ));
     }
@@ -6032,14 +6058,14 @@ private static ParseTree parse_wf_body_element(ParserContext ctx) throws SyntaxE
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[70][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(137, "wf_body_element"));
+        int rule = (current != null) ? table[2][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(69, "wf_body_element"));
         ctx.nonterminal = "wf_body_element";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "wf_body_element",
-                nonterminal_first.get(137),
-                nonterminal_rules.get(137)
+                nonterminal_first.get(69),
+                nonterminal_rules.get(69)
             ));
         }
         if (rule == 62) {
@@ -6109,7 +6135,7 @@ else if (rule == 69) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "wf_body_element",
             current,
-            nonterminal_first.get(137),
+            nonterminal_first.get(69),
             rules.get(69)
         ));
     }
@@ -6121,14 +6147,14 @@ private static ParseTree parse_wf_meta(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[36][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(103, "wf_meta"));
+        int rule = (current != null) ? table[4][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(71, "wf_meta"));
         ctx.nonterminal = "wf_meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "wf_meta",
-                nonterminal_first.get(103),
-                nonterminal_rules.get(103)
+                nonterminal_first.get(71),
+                nonterminal_rules.get(71)
             ));
         }
         if (rule == 84) {
@@ -6146,7 +6172,7 @@ private static ParseTree parse_wf_meta(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "wf_meta",
             current,
-            nonterminal_first.get(103),
+            nonterminal_first.get(71),
             rules.get(84)
         ));
     }
@@ -6158,14 +6184,14 @@ private static ParseTree parse_wf_parameter_meta(ParserContext ctx) throws Synta
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[44][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(111, "wf_parameter_meta"));
+        int rule = (current != null) ? table[52][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(119, "wf_parameter_meta"));
         ctx.nonterminal = "wf_parameter_meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "wf_parameter_meta",
-                nonterminal_first.get(111),
-                nonterminal_rules.get(111)
+                nonterminal_first.get(119),
+                nonterminal_rules.get(119)
             ));
         }
         if (rule == 83) {
@@ -6183,7 +6209,7 @@ private static ParseTree parse_wf_parameter_meta(ParserContext ctx) throws Synta
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "wf_parameter_meta",
             current,
-            nonterminal_first.get(111),
+            nonterminal_first.get(119),
             rules.get(83)
         ));
     }
@@ -6195,14 +6221,14 @@ private static ParseTree parse_workflow(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[67][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(134, "workflow"));
+        int rule = (current != null) ? table[74][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(141, "workflow"));
         ctx.nonterminal = "workflow";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "workflow",
-                nonterminal_first.get(134),
-                nonterminal_rules.get(134)
+                nonterminal_first.get(141),
+                nonterminal_rules.get(141)
             ));
         }
         if (rule == 61) {
@@ -6227,7 +6253,7 @@ private static ParseTree parse_workflow(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "workflow",
             current,
-            nonterminal_first.get(134),
+            nonterminal_first.get(141),
             rules.get(61)
         ));
     }
@@ -6357,9 +6383,6 @@ public void output(LexerContext ctx, TerminalIdentifier terminal, String source_
     default_action(ctx, terminal, source_string, line, col);
 }
     /* END USER CODE */
-    public List<Terminal> post_filter(List<Terminal> terminals) {
-        return terminals;
-    }
     public void destroy(Object context) {
         return;
     }
@@ -7867,8 +7890,7 @@ public List<Terminal> lex(String string, String resource) throws SyntaxError {
             }
         }
         this.destroy(context);
-        List<Terminal> filtered = post_filter(lctx.terminals);
-        return filtered;
+        return lctx.terminals;
     }
     /* Section: Main */
 }
diff --git a/wdl/transforms/biscayne/src/main/resources/CHANGELOG.txt b/wdl/transforms/biscayne/src/main/resources/CHANGELOG.txt
index af2ba7d94e7..d6897aa1358 100644
--- a/wdl/transforms/biscayne/src/main/resources/CHANGELOG.txt
+++ b/wdl/transforms/biscayne/src/main/resources/CHANGELOG.txt
@@ -1,4 +1,15 @@
 2023-03-16
 Synced grammar from OpenWDL `development` version, which is actually development of 2.0. There is no 1.1 Hermes grammar, develop it here.
 Changed version declaration to `development1_1`.
-This disallows `version 1.1` workflows to run with incomplete support. Once development is finished, change to `1.1`.
\ No newline at end of file
+This disallows `version 1.1` workflows to run with incomplete support. Once development is finished, change to `1.1`.
+
+2024-02-28
+When changing the grammar file, generate a new parser by:
+- changing current working directory to cromwell/wdl/transforms/biscayne
+- running: hermes generate src/main/resources/grammar.hgr \
+          --language=java \
+          --directory=src/main/java \
+          --name=wdl \
+          --java-package=wdl.biscayne.parser \
+          --java-use-apache-commons --java-imports=org.apache.commons.lang3.StringEscapeUtils \
+          --header
\ No newline at end of file
diff --git a/wdl/transforms/biscayne/src/main/resources/grammar.hgr b/wdl/transforms/biscayne/src/main/resources/grammar.hgr
index e12ad170e60..451d7e61631 100644
--- a/wdl/transforms/biscayne/src/main/resources/grammar.hgr
+++ b/wdl/transforms/biscayne/src/main/resources/grammar.hgr
@@ -401,6 +401,7 @@ grammar {
       (*:unary) $e = :not $e -> LogicalNot(expression=$1)
       (-:unary) $e = :plus $e -> UnaryPlus(expression=$1)
       (-:unary) $e = :dash $e -> UnaryNegation(expression=$1)
+      (*:left) $e = :identifier <=> :lbrace list($object_kv, :comma) :rbrace -> StructLiteral(name=$0, map=$2)
       (*:left) $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall(name=$0, params=$2)
       (*:left) $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup(lhs=$0, rhs=$2)
       (*:left) $e = $e <=> :dot :identifier -> MemberAccess(value=$0, member=$2)
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumers.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumers.scala
index dd909356ff8..58ab50ede6e 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumers.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumers.scala
@@ -105,4 +105,14 @@ object BiscayneExpressionValueConsumers {
         // None literals consume no values:
         Set.empty[UnlinkedConsumedValueHook]
     }
+
+  implicit val structLiteralExpressionValueConsumer: ExpressionValueConsumer[StructLiteral] =
+    new ExpressionValueConsumer[StructLiteral] {
+      override def expressionConsumedValueHooks(a: StructLiteral)(implicit
+        expressionValueConsumer: ExpressionValueConsumer[ExpressionElement]
+      ): Set[UnlinkedConsumedValueHook] =
+        a.elements.values
+          .flatMap(element => expressionValueConsumer.expressionConsumedValueHooks(element)(expressionValueConsumer))
+          .toSet
+    }
 }
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/consumed.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/consumed.scala
index 93df393d4fa..743f444f998 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/consumed.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/consumed/consumed.scala
@@ -24,6 +24,7 @@ package object consumed {
 
         case a: StringExpression => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: ObjectLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
+        case a: StructLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: PairLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: ArrayLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: MapLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluators.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluators.scala
index 77de240732e..420c0b5aa21 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluators.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluators.scala
@@ -1,5 +1,8 @@
 package wdl.transforms.biscayne.linking.expression.files
 
+import cats.implicits.{catsSyntaxValidatedId, toTraverseOps}
+import common.validation.ErrorOr.ErrorOr
+import wdl.model.draft3.elements.ExpressionElement
 import wdl.model.draft3.elements.ExpressionElement.{
   AsMap,
   AsPairs,
@@ -10,16 +13,20 @@ import wdl.model.draft3.elements.ExpressionElement.{
   Quote,
   Sep,
   SQuote,
+  StructLiteral,
   SubPosix,
   Suffix,
   Unzip
 }
-import wdl.model.draft3.graph.expression.FileEvaluator
+import wdl.model.draft3.graph.expression.{FileEvaluator, ValueEvaluator}
 import wdl.transforms.base.linking.expression.files.EngineFunctionEvaluators.{
   threeParameterFunctionPassthroughFileEvaluator,
   twoParameterFunctionPassthroughFileEvaluator
 }
 import wdl.transforms.base.linking.expression.files.EngineFunctionEvaluators.singleParameterPassthroughFileEvaluator
+import wom.expression.IoFunctionSet
+import wom.types.{WomCompositeType, WomType}
+import wom.values.{WomFile, WomValue}
 
 object BiscayneFileEvaluators {
 
@@ -39,4 +46,38 @@ object BiscayneFileEvaluators {
   implicit val maxFunctionEvaluator: FileEvaluator[Max] = twoParameterFunctionPassthroughFileEvaluator[Max]
 
   implicit val unzipFunctionEvaluator: FileEvaluator[Unzip] = singleParameterPassthroughFileEvaluator
+
+  implicit val structLiteralEvaluator: FileEvaluator[StructLiteral] = new FileEvaluator[StructLiteral] {
+    override def predictFilesNeededToEvaluate(a: StructLiteral,
+                                              inputs: Map[String, WomValue],
+                                              ioFunctionSet: IoFunctionSet,
+                                              coerceTo: WomType
+    )(implicit
+      fileEvaluator: FileEvaluator[ExpressionElement],
+      valueEvaluator: ValueEvaluator[ExpressionElement]
+    ): ErrorOr[Set[WomFile]] = {
+      def filesInObjectField(fieldAndWomTypeTuple: (String, WomType)): ErrorOr[Set[WomFile]] = {
+        val (field, womType) = fieldAndWomTypeTuple
+        a.elements.get(field) match {
+          case Some(fieldElement) =>
+            fileEvaluator.predictFilesNeededToEvaluate(fieldElement, inputs, ioFunctionSet, womType)(fileEvaluator,
+                                                                                                     valueEvaluator
+            )
+          case None => s"Invalid assignment to struct. Required field $field was not specified.".invalidNel
+        }
+      }
+
+      coerceTo match {
+        case WomCompositeType(mapping, _) => mapping.toList.traverse(filesInObjectField).map(_.flatten.toSet)
+        case _ =>
+          a.elements.values.toList
+            .traverse(
+              fileEvaluator.evaluateFilesNeededToEvaluate(_, inputs, ioFunctionSet, coerceTo)(fileEvaluator,
+                                                                                              valueEvaluator
+              )
+            )
+            .map(_.toSet.flatten)
+      }
+    }
+  }
 }
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/files.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/files.scala
index 40807bf3e58..4c224c8c024 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/files.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/files/files.scala
@@ -16,7 +16,6 @@ import wom.expression.IoFunctionSet
 import wom.types.WomType
 import wom.values.{WomFile, WomValue}
 import wdl.transforms.biscayne.linking.expression.files.BiscayneFileEvaluators._
-
 package object files {
 
   implicit val expressionFileEvaluator: FileEvaluator[ExpressionElement] = new FileEvaluator[ExpressionElement] {
@@ -37,6 +36,8 @@ package object files {
           a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
         case a: ObjectLiteral =>
           a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
+        case a: StructLiteral =>
+          a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
         case a: MapLiteral =>
           a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
         case a: ArrayLiteral =>
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluators.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluators.scala
index 21f2e9bcc8c..75c6cc297ae 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluators.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluators.scala
@@ -159,4 +159,16 @@ object BiscayneTypeEvaluators {
         case other => s"Cannot invoke 'unzip' on type '${other.stableName}'. Expected an array of pairs".invalidNel
       }
   }
+
+  implicit val structLiteralTypeEvaluator: TypeEvaluator[StructLiteral] = new TypeEvaluator[StructLiteral] {
+    override def evaluateType(a: StructLiteral, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(
+      implicit expressionTypeEvaluator: TypeEvaluator[ExpressionElement]
+    ): ErrorOr[WomType] =
+      // This works fine, but is not yet a strong enough type check for the WDL 1.1 spec
+      // (i.e. users are able to instantiate struct literals with k/v pairs that aren't actually in the struct definition, without an error being thrown.)
+      // We want to add extra validation here, and return a WomCompositeType that matches the struct definition of everything is OK.
+      // Note that users are allowed to omit optional k/v pairs in their literal.
+      // This requires some extra work to be done in a subsequent PR.
+      WomObjectType.validNel
+  }
 }
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala
index 9775cb38970..7352c9a1376 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/types/types.scala
@@ -29,6 +29,7 @@ package object types {
         case a: StringLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: StringExpression => a.evaluateType(linkedValues)(typeEvaluator)
         case a: ObjectLiteral => a.evaluateType(linkedValues)(typeEvaluator)
+        case a: StructLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: MapLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: ArrayLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: PairLiteral => a.evaluateType(linkedValues)(typeEvaluator)
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluators.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluators.scala
index 9903313bf00..a95a4b2f43c 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluators.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluators.scala
@@ -18,7 +18,7 @@ import wdl.transforms.base.linking.expression.values.EngineFunctionEvaluators.{
 }
 import wom.expression.IoFunctionSet
 import wom.types._
-import wom.values.{WomArray, WomFloat, WomInteger, WomMap, WomOptionalValue, WomPair, WomString, WomValue}
+import wom.values.{WomArray, WomFloat, WomInteger, WomMap, WomObject, WomOptionalValue, WomPair, WomString, WomValue}
 import wom.types.coercion.defaults._
 
 object BiscayneValueEvaluators {
@@ -351,4 +351,29 @@ object BiscayneValueEvaluators {
           s"Invalid call of 'unzip' on parameter of type '${other.womType.stableName}' (expected Array[Pair[X, Y]])".invalidNel
       }
   }
+
+  implicit val structLiteralValueEvaluator: ValueEvaluator[StructLiteral] = new ValueEvaluator[StructLiteral] {
+    // This works fine, but is missing a feature from the WDL 1.1 spec: users are allowed to omit optional values from their struct literal.
+    // This requires some extra work to be done in a subsequent PR.
+    // Specifically, make the known struct definitions available to this function so we can populate k/v pairs with None appropriately.
+    override def evaluateValue(a: StructLiteral,
+                               inputs: Map[String, WomValue],
+                               ioFunctionSet: IoFunctionSet,
+                               forCommandInstantiationOptions: Option[ForCommandInstantiationOptions]
+    )(implicit expressionValueEvaluator: ValueEvaluator[ExpressionElement]): ErrorOr[EvaluatedValue[_ <: WomValue]] = {
+
+      val evaluated: ErrorOr[List[(String, EvaluatedValue[_])]] = a.elements.toList traverse {
+        case (key: String, value: ExpressionElement) =>
+          expressionValueEvaluator
+            .evaluateValue(value, inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
+            .map(key -> _)
+      }
+
+      evaluated map { mapping =>
+        val value = mapping.map(entry => entry._1 -> entry._2.value).toMap
+        val sideEffectFiles = mapping.flatMap(entry => entry._2.sideEffectFiles)
+        EvaluatedValue(WomObject(value), sideEffectFiles)
+      }
+    }
+  }
 }
diff --git a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/values.scala b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/values.scala
index eeb5bd1712f..3a1db596732 100644
--- a/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/values.scala
+++ b/wdl/transforms/biscayne/src/main/scala/wdl/transforms/biscayne/linking/expression/values/values.scala
@@ -32,13 +32,14 @@ package object values {
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: NoneLiteralElement.type =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
-
         case a: StringLiteral =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: StringExpression =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: ObjectLiteral =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
+        case a: StructLiteral =>
+          a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: MapLiteral =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: ArrayLiteral =>
diff --git a/wdl/transforms/biscayne/src/test/cases/struct_literal.wdl b/wdl/transforms/biscayne/src/test/cases/struct_literal.wdl
new file mode 100644
index 00000000000..6251ebf4a58
--- /dev/null
+++ b/wdl/transforms/biscayne/src/test/cases/struct_literal.wdl
@@ -0,0 +1,39 @@
+version development-1.1
+
+struct Plant {
+    String color
+    Boolean tasty
+}
+
+struct Animal {
+    String name
+    Boolean? isGood
+}
+
+task test_struct_parsing {
+    input {
+        Plant standard_plant_input
+        Animal standard_animal_input
+    }
+
+    runtime {
+        docker: "ubuntu:latest"
+    }
+
+    command {
+       echo "all dogs are good"
+    }
+
+    output {
+        Plant standard_plant_forwarded = standard_plant_input
+        Animal standard_animal_forwarded = standard_animal_input
+        Plant plant_output_literal = Plant{color: "red", tasty: true}
+    }
+}
+
+workflow struct_literal {
+    call test_struct_parsing {
+         input: standard_plant_input = Plant{color: "green", tasty: true},
+            standard_animal_input = Animal{name: "mittens", isGood: false}
+         }
+}
diff --git a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/Ast2WdlomSpec.scala b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/Ast2WdlomSpec.scala
index dae69cfdcf8..baa70691580 100644
--- a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/Ast2WdlomSpec.scala
+++ b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/Ast2WdlomSpec.scala
@@ -18,7 +18,7 @@ import wdl.transforms.biscayne.ast2wdlom._
 import wdl.transforms.biscayne.parsing.WdlBiscayneSyntaxErrorFormatter
 import wom.callable.MetaValueElement.MetaValueElementInteger
 import wom.types.WomIntegerType
-import wom.values.WomInteger
+import wom.values.{WomBoolean, WomInteger}
 
 import scala.jdk.CollectionConverters._
 
@@ -126,4 +126,13 @@ class Ast2WdlomSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
     val expr = fromString[ExpressionElement](str, parser.parse_e)
     expr shouldBeValid (Unzip(IdentifierLookup("some_array_of_pairs")))
   }
+
+  it should "parse a struct literal" in {
+    val str = """Dog{breed: "fluffy", isGood: true}"""
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+    expr shouldBeValid (StructLiteral(
+      "Dog",
+      Map("breed" -> StringLiteral("fluffy"), "isGood" -> PrimitiveLiteralExpressionElement(WomBoolean(true)))
+    ))
+  }
 }
diff --git a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/ast2wdlom/WdlFileToWdlomSpec.scala b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/ast2wdlom/WdlFileToWdlomSpec.scala
index 20e940dab39..0725442f5a5 100644
--- a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/ast2wdlom/WdlFileToWdlomSpec.scala
+++ b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/ast2wdlom/WdlFileToWdlomSpec.scala
@@ -6,11 +6,11 @@ import org.scalatest.flatspec.AnyFlatSpec
 import org.scalatest.matchers.should.Matchers
 import wdl.model.draft3.elements.CommandPartElement.{PlaceholderCommandPartElement, StringCommandPartElement}
 import wdl.model.draft3.elements.ExpressionElement._
-import wdl.model.draft3.elements._
+import wdl.model.draft3.elements.{CallElement, FileElement, _}
 import wdl.transforms.biscayne.ast2wdlom.WdlFileToWdlomSpec._
 import wom.SourceFileLocation
 import wom.types._
-import wom.values.WomInteger
+import wom.values.{WomBoolean, WomInteger}
 
 class WdlFileToWdlomSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
 
@@ -36,7 +36,9 @@ class WdlFileToWdlomSpec extends AnyFlatSpec with CromwellTimeoutSpec with Match
 
     testOrIgnore {
 
-      val expected = expectations.getOrElse(testName, fail(s"No Element expectation defined for $testName"))
+      val expected: FileElement =
+        expectations.getOrElse(testName, fail(s"No Element expectation defined for $testName"))
+
       fileToFileElement.run(testCase) match {
         case Right(actual) => actual shouldBe expected
         case Left(errors) =>
@@ -367,6 +369,104 @@ object WdlFileToWdlomSpec {
           )
         ),
         tasks = Vector.empty
+      ),
+    "struct_literal" -> FileElement(
+      imports = Vector(),
+      structs = Vector(
+        StructElement("Plant",
+                      Vector(StructEntryElement("color", PrimitiveTypeElement(WomStringType)),
+                             StructEntryElement("tasty", PrimitiveTypeElement(WomBooleanType))
+                      )
+        ),
+        StructElement(
+          "Animal",
+          Vector(StructEntryElement("name", PrimitiveTypeElement(WomStringType)),
+                 StructEntryElement("isGood", OptionalTypeElement(PrimitiveTypeElement(WomBooleanType)))
+          )
+        )
+      ),
+      workflows = Vector(
+        WorkflowDefinitionElement(
+          "struct_literal",
+          None,
+          Set(
+            CallElement(
+              "test_struct_parsing",
+              None,
+              Vector(),
+              Some(
+                CallBodyElement(
+                  Vector(
+                    KvPair("standard_plant_input",
+                           StructLiteral("Plant",
+                                         Map("color" -> StringLiteral("green"),
+                                             "tasty" -> PrimitiveLiteralExpressionElement(WomBoolean(true))
+                                         )
+                           )
+                    ),
+                    KvPair("standard_animal_input",
+                           StructLiteral("Animal",
+                                         Map("name" -> StringLiteral("mittens"),
+                                             "isGood" -> PrimitiveLiteralExpressionElement(WomBoolean(false))
+                                         )
+                           )
+                    )
+                  )
+                )
+              ),
+              Some(SourceFileLocation(35))
+            )
+          ),
+          None,
+          None,
+          None,
+          Some(SourceFileLocation(34))
+        )
+      ),
+      tasks = Vector(
+        TaskDefinitionElement(
+          "test_struct_parsing",
+          Some(
+            InputsSectionElement(
+              Vector(
+                InputDeclarationElement(TypeAliasElement("Plant"), "standard_plant_input", None),
+                InputDeclarationElement(TypeAliasElement("Animal"), "standard_animal_input", None)
+              )
+            )
+          ),
+          Vector(),
+          Some(
+            OutputsSectionElement(
+              Vector(
+                OutputDeclarationElement(TypeAliasElement("Plant"),
+                                         "standard_plant_forwarded",
+                                         IdentifierLookup("standard_plant_input")
+                ),
+                OutputDeclarationElement(TypeAliasElement("Animal"),
+                                         "standard_animal_forwarded",
+                                         IdentifierLookup("standard_animal_input")
+                ),
+                OutputDeclarationElement(
+                  TypeAliasElement("Plant"),
+                  "plant_output_literal",
+                  StructLiteral("Plant",
+                                Map("color" -> StringLiteral("red"),
+                                    "tasty" -> PrimitiveLiteralExpressionElement(WomBoolean(true))
+                                )
+                  )
+                )
+              )
+            )
+          ),
+          CommandSectionElement(
+            List(CommandSectionLine(Vector(StringCommandPartElement("""echo "all dogs are good""""))))
+          ),
+          Some(RuntimeAttributesSectionElement(Vector(KvPair("docker", StringLiteral("ubuntu:latest"))))),
+          None,
+          None,
+          Some(SourceFileLocation(13))
+        )
       )
+    )
   )
 }
diff --git a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumersSpec.scala b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumersSpec.scala
index b20b844b02e..cfa2a609ed4 100644
--- a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumersSpec.scala
+++ b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/consumed/BiscayneExpressionValueConsumersSpec.scala
@@ -111,4 +111,13 @@ class BiscayneExpressionValueConsumersSpec extends AnyFlatSpec with CromwellTime
       e.expressionConsumedValueHooks should be(Set(UnlinkedIdentifierHook("my_array_of_pairs")))
     }
   }
+
+  it should "discover an array variable lookup within a struct literal member access" in {
+    val str = """ (StructWithAnArray{myArrayMember: arrayToLookup}).myArray """
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+
+    expr.shouldBeValidPF { case e =>
+      e.expressionConsumedValueHooks should be(Set(UnlinkedIdentifierHook("arrayToLookup")))
+    }
+  }
 }
diff --git a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluatorSpec.scala b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluatorSpec.scala
index 69ac8a9cfca..31225bb0263 100644
--- a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluatorSpec.scala
+++ b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/files/BiscayneFileEvaluatorSpec.scala
@@ -100,4 +100,15 @@ class BiscayneFileEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec wit
       )
     }
   }
+
+  it should "discover the file which would be required to evaluate a struct literal" in {
+    val str = """ StructWithStringVec{myVec: read_lines("foo.txt")}"""
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+
+    expr.shouldBeValidPF { case e =>
+      e.predictFilesNeededToEvaluate(Map.empty, NoIoFunctionSet, WomStringType) shouldBeValid Set(
+        WomSingleFile("foo.txt")
+      )
+    }
+  }
 }
diff --git a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluatorSpec.scala b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluatorSpec.scala
index a38a80079e5..0c5c158b542 100644
--- a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluatorSpec.scala
+++ b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/types/BiscayneTypeEvaluatorSpec.scala
@@ -131,4 +131,14 @@ class BiscayneTypeEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec wit
       e.evaluateType(Map.empty) shouldBeValid WomPairType(WomArrayType(WomAnyType), WomArrayType(WomAnyType))
     }
   }
+
+  it should "evaluate the type of a struct literal" in {
+    // NB: This is not yet strict enough type checking for the WDL 1.1 spec.
+    // In a subsequent branch, we will make this be a WomCompositeType that matches the struct definition.
+    val structLiteral = """ Animal{fur: "fuzzy", isGood: true} """
+    val structExpr = fromString[ExpressionElement](structLiteral, parser.parse_e)
+    structExpr.shouldBeValidPF { case e =>
+      e.evaluateType(Map.empty) shouldBeValid WomObjectType
+    }
+  }
 }
diff --git a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluatorSpec.scala b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluatorSpec.scala
index a6d3066b5e9..66045fef5ae 100644
--- a/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluatorSpec.scala
+++ b/wdl/transforms/biscayne/src/test/scala/wdl/transforms/biscayne/linking/expression/values/BiscayneValueEvaluatorSpec.scala
@@ -12,7 +12,7 @@ import wdl.transforms.biscayne.Ast2WdlomSpec.{fromString, parser}
 import wdl.transforms.biscayne.ast2wdlom._
 import wom.expression.NoIoFunctionSet
 import wom.types.{WomAnyType, WomArrayType, WomIntegerType, WomMapType, WomOptionalType, WomStringType}
-import wom.values.{WomArray, WomInteger, WomMap, WomOptionalValue, WomPair, WomString}
+import wom.values.{WomArray, WomBoolean, WomInteger, WomMap, WomObject, WomOptionalValue, WomPair, WomString}
 
 class BiscayneValueEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
 
@@ -510,4 +510,14 @@ class BiscayneValueEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec wi
         )
     )
   }
+
+  it should "evaluate a struct literal" in {
+    val literal = """ Animal{type: "dog", barks: false}"""
+    val expectedValue = WomObject(Map("type" -> WomString("dog"), "barks" -> WomBoolean(false)))
+    val expr = fromString[ExpressionElement](literal, parser.parse_e)
+
+    expr.shouldBeValidPF { case e =>
+      e.evaluateValue(Map.empty, NoIoFunctionSet, None) shouldBeValid EvaluatedValue(expectedValue, Seq.empty)
+    }
+  }
 }
diff --git a/wdl/transforms/cascades/src/main/java/wdl/cascades/parser/WdlParser.java b/wdl/transforms/cascades/src/main/java/wdl/cascades/parser/WdlParser.java
index 678bef21092..fce14da1e72 100644
--- a/wdl/transforms/cascades/src/main/java/wdl/cascades/parser/WdlParser.java
+++ b/wdl/transforms/cascades/src/main/java/wdl/cascades/parser/WdlParser.java
@@ -1,9 +1,9 @@
 
 /*
- * This file was generated by Hermes Parser Generator on Mon Mar 27 20:16:01 2023
+ * This file was generated by Hermes Parser Generator on Tue Mar 26 15:18:16 2024
  * 
- * Hermes command: hermes generate resources/grammar.hgr --language=java --directory=java --name=wdl --java-package=wdl.cascades.parser --java-use-apache-commons --java-imports=org.apache.commons.lang3.StringEscapeUtils --header
- * Run from: .. (relative to this file)
+ * Hermes command: hermes generate src/main/resources/grammar.hgr --language=java --directory=src/main/java --name=wdl --java-package=wdl.cascades.parser --java-use-apache-commons --java-imports=org.apache.commons.lang3.StringEscapeUtils --header
+ * Run from: ../../.. (relative to this file)
  * Hermes version: hermes-parser 2.0rc6
  * 
  * !!! DO NOT CHANGE THIS FILE DIRECTLY !!!
@@ -252,12 +252,12 @@ public interface ParseTreeNode {
     }
     public static class Terminal implements AstNode, ParseTreeNode
     {
-        public int id;
-        public String terminal_str;
-        public String source_string;
-        public String resource;
-        public int line;
-        public int col;
+        private int id;
+        private String terminal_str;
+        private String source_string;
+        private String resource;
+        private int line;
+        private int col;
         public Terminal(int id, String terminal_str, String source_string, String resource, int line, int col) {
             this.id = id;
             this.terminal_str = terminal_str;
@@ -516,73 +516,73 @@ public interface TerminalIdentifier {
         public String string();
     }
     public enum WdlTerminalIdentifier implements TerminalIdentifier {
-        TERMINAL_AFTER(11, "after"),
-        TERMINAL_ALIAS(18, "alias"),
-        TERMINAL_AS(7, "as"),
-        TERMINAL_ASTERISK(3, "asterisk"),
-        TERMINAL_BOOLEAN(30, "boolean"),
-        TERMINAL_CALL(19, "call"),
-        TERMINAL_CMD_ATTR_HINT(33, "cmd_attr_hint"),
-        TERMINAL_CMD_PART(46, "cmd_part"),
-        TERMINAL_COLON(37, "colon"),
-        TERMINAL_COMMA(38, "comma"),
-        TERMINAL_DASH(63, "dash"),
+        TERMINAL_AFTER(47, "after"),
+        TERMINAL_ALIAS(0, "alias"),
+        TERMINAL_AS(36, "as"),
+        TERMINAL_ASTERISK(34, "asterisk"),
+        TERMINAL_BOOLEAN(41, "boolean"),
+        TERMINAL_CALL(57, "call"),
+        TERMINAL_CMD_ATTR_HINT(26, "cmd_attr_hint"),
+        TERMINAL_CMD_PART(7, "cmd_part"),
+        TERMINAL_COLON(58, "colon"),
+        TERMINAL_COMMA(4, "comma"),
+        TERMINAL_DASH(53, "dash"),
         TERMINAL_DOT(62, "dot"),
-        TERMINAL_DOUBLE_AMPERSAND(13, "double_ampersand"),
-        TERMINAL_DOUBLE_EQUAL(24, "double_equal"),
-        TERMINAL_DOUBLE_PIPE(25, "double_pipe"),
-        TERMINAL_E(36, "e"),
-        TERMINAL_ELSE(41, "else"),
-        TERMINAL_EQUAL(53, "equal"),
-        TERMINAL_ESCAPE(31, "escape"),
-        TERMINAL_EXPRESSION_PLACEHOLDER_END(35, "expression_placeholder_end"),
-        TERMINAL_EXPRESSION_PLACEHOLDER_START(42, "expression_placeholder_start"),
-        TERMINAL_FLOAT(56, "float"),
-        TERMINAL_FQN(22, "fqn"),
-        TERMINAL_GT(4, "gt"),
-        TERMINAL_GTEQ(21, "gteq"),
-        TERMINAL_IDENTIFIER(23, "identifier"),
-        TERMINAL_IF(61, "if"),
-        TERMINAL_IMPORT(6, "import"),
-        TERMINAL_IN(17, "in"),
-        TERMINAL_INPUT(49, "input"),
-        TERMINAL_INTEGER(48, "integer"),
-        TERMINAL_LBRACE(32, "lbrace"),
-        TERMINAL_LPAREN(12, "lparen"),
-        TERMINAL_LSQUARE(51, "lsquare"),
-        TERMINAL_LT(65, "lt"),
-        TERMINAL_LTEQ(1, "lteq"),
-        TERMINAL_META(45, "meta"),
+        TERMINAL_DOUBLE_AMPERSAND(8, "double_ampersand"),
+        TERMINAL_DOUBLE_EQUAL(56, "double_equal"),
+        TERMINAL_DOUBLE_PIPE(49, "double_pipe"),
+        TERMINAL_E(44, "e"),
+        TERMINAL_ELSE(35, "else"),
+        TERMINAL_EQUAL(39, "equal"),
+        TERMINAL_ESCAPE(32, "escape"),
+        TERMINAL_EXPRESSION_PLACEHOLDER_END(17, "expression_placeholder_end"),
+        TERMINAL_EXPRESSION_PLACEHOLDER_START(5, "expression_placeholder_start"),
+        TERMINAL_FLOAT(45, "float"),
+        TERMINAL_FQN(18, "fqn"),
+        TERMINAL_GT(2, "gt"),
+        TERMINAL_GTEQ(3, "gteq"),
+        TERMINAL_IDENTIFIER(29, "identifier"),
+        TERMINAL_IF(40, "if"),
+        TERMINAL_IMPORT(31, "import"),
+        TERMINAL_IN(43, "in"),
+        TERMINAL_INPUT(24, "input"),
+        TERMINAL_INTEGER(19, "integer"),
+        TERMINAL_LBRACE(50, "lbrace"),
+        TERMINAL_LPAREN(28, "lparen"),
+        TERMINAL_LSQUARE(61, "lsquare"),
+        TERMINAL_LT(37, "lt"),
+        TERMINAL_LTEQ(11, "lteq"),
+        TERMINAL_META(33, "meta"),
         TERMINAL_META_VALUE(16, "meta_value"),
-        TERMINAL_NONE(44, "none"),
-        TERMINAL_NOT(60, "not"),
-        TERMINAL_NOT_EQUAL(14, "not_equal"),
-        TERMINAL_NULL(40, "null"),
-        TERMINAL_OBJECT(59, "object"),
-        TERMINAL_OUTPUT(28, "output"),
-        TERMINAL_PARAMETER_META(15, "parameter_meta"),
-        TERMINAL_PERCENT(5, "percent"),
-        TERMINAL_PLUS(9, "plus"),
-        TERMINAL_QMARK(57, "qmark"),
-        TERMINAL_QUOTE(50, "quote"),
-        TERMINAL_RAW_CMD_END(58, "raw_cmd_end"),
-        TERMINAL_RAW_CMD_START(27, "raw_cmd_start"),
-        TERMINAL_RAW_COMMAND(39, "raw_command"),
-        TERMINAL_RBRACE(0, "rbrace"),
-        TERMINAL_RPAREN(52, "rparen"),
-        TERMINAL_RSQUARE(8, "rsquare"),
-        TERMINAL_RUNTIME(54, "runtime"),
-        TERMINAL_SCATTER(66, "scatter"),
-        TERMINAL_SLASH(29, "slash"),
-        TERMINAL_STRING(26, "string"),
-        TERMINAL_STRUCT(34, "struct"),
-        TERMINAL_TASK(10, "task"),
-        TERMINAL_THEN(2, "then"),
-        TERMINAL_TYPE(43, "type"),
-        TERMINAL_TYPE_E(20, "type_e"),
-        TERMINAL_VERSION(64, "version"),
-        TERMINAL_VERSION_NAME(55, "version_name"),
-        TERMINAL_WORKFLOW(47, "workflow"),
+        TERMINAL_NONE(54, "none"),
+        TERMINAL_NOT(52, "not"),
+        TERMINAL_NOT_EQUAL(63, "not_equal"),
+        TERMINAL_NULL(51, "null"),
+        TERMINAL_OBJECT(66, "object"),
+        TERMINAL_OUTPUT(60, "output"),
+        TERMINAL_PARAMETER_META(30, "parameter_meta"),
+        TERMINAL_PERCENT(22, "percent"),
+        TERMINAL_PLUS(12, "plus"),
+        TERMINAL_QMARK(9, "qmark"),
+        TERMINAL_QUOTE(14, "quote"),
+        TERMINAL_RAW_CMD_END(10, "raw_cmd_end"),
+        TERMINAL_RAW_CMD_START(15, "raw_cmd_start"),
+        TERMINAL_RAW_COMMAND(27, "raw_command"),
+        TERMINAL_RBRACE(23, "rbrace"),
+        TERMINAL_RPAREN(64, "rparen"),
+        TERMINAL_RSQUARE(42, "rsquare"),
+        TERMINAL_RUNTIME(13, "runtime"),
+        TERMINAL_SCATTER(55, "scatter"),
+        TERMINAL_SLASH(20, "slash"),
+        TERMINAL_STRING(1, "string"),
+        TERMINAL_STRUCT(6, "struct"),
+        TERMINAL_TASK(38, "task"),
+        TERMINAL_THEN(46, "then"),
+        TERMINAL_TYPE(21, "type"),
+        TERMINAL_TYPE_E(48, "type_e"),
+        TERMINAL_VERSION(25, "version"),
+        TERMINAL_VERSION_NAME(59, "version_name"),
+        TERMINAL_WORKFLOW(65, "workflow"),
         END_SENTINAL(-3, "END_SENTINAL");
         private final int id;
         private final String string;
@@ -595,112 +595,112 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
     }
     /* table[nonterminal][terminal] = rule */
     private static final int[][] table = {
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1 },
-        { 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, 62, 63, -1, -1, 63, -1, -1, -1, -1, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, 69, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, 65 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, 74, 74, -1, -1, 74, -1, -1, -1, -1, 74, -1, -1, -1, 73, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, 74, -1, -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, 74 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { 71, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, 71, -1, -1, -1, 71, -1, -1, -1, 71, 71, -1, -1, 71, -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, 71, -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, 71 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, 56, -1, 56, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, 56, -1, -1, -1, 56, -1, 56, 56, -1, -1, -1, -1, 56, -1, -1, 56, 56, 56, -1, 56, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, 16, -1, -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1, -1, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86 },
+        { -1, -1, -1, -1, -1, 36, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, 71, 71, -1, -1, -1, -1, 71, 71, -1, -1, 71, -1, -1, 70, -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, 71, 71, -1, -1, -1, -1, -1, -1, 71, -1, 71, -1, -1, 71, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, -1, 74, 74, -1, -1, -1, -1, 74, 74, -1, -1, 74, -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, 74, -1, 73, -1, -1, -1, -1, 74, -1, 74, -1, -1, 74, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, 52, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, 76, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, 19, 18, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, 66, -1, -1, -1, -1, 63, 68, -1, -1, 69, -1, -1, -1, -1, -1, -1, 64, -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, 65, -1, 62, -1, -1, 67, -1, -1, -1, -1, -1, -1 },
+        { 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, 27, -1, -1, 26, -1, 32, 30, -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { 19, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, 18, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 30, -1, -1, -1, -1, 32, -1, -1, 32, -1, -1, -1, -1, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, -1, -1, -1, 32, -1, 31, -1, -1, -1, 27, -1, -1, -1, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
-        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, -1, 56, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, -1, -1, 56, 56, -1, -1, -1, -1, 56, -1, 56, 56, 56, -1, -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, 56 },
         { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
+        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
     };
     static {
         Map<Integer, List<TerminalIdentifier>> map = new HashMap<Integer, List<TerminalIdentifier>>();
-        map.put(96, Arrays.asList(new TerminalIdentifier[] {
+        map.put(81, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
         }));
-        map.put(98, Arrays.asList(new TerminalIdentifier[] {
+        map.put(77, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(121, Arrays.asList(new TerminalIdentifier[] {
+        map.put(124, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(74, Arrays.asList(new TerminalIdentifier[] {
+        map.put(97, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(110, Arrays.asList(new TerminalIdentifier[] {
+        map.put(106, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(70, Arrays.asList(new TerminalIdentifier[] {
+        map.put(101, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_EQUAL,
         }));
-        map.put(67, Arrays.asList(new TerminalIdentifier[] {
+        map.put(119, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+        map.put(98, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -712,27 +712,27 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(81, Arrays.asList(new TerminalIdentifier[] {
+        map.put(95, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(132, Arrays.asList(new TerminalIdentifier[] {
+        map.put(135, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
         }));
-        map.put(78, Arrays.asList(new TerminalIdentifier[] {
+        map.put(100, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(117, Arrays.asList(new TerminalIdentifier[] {
+        map.put(107, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INPUT,
         }));
-        map.put(140, Arrays.asList(new TerminalIdentifier[] {
+        map.put(131, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(119, Arrays.asList(new TerminalIdentifier[] {
+        map.put(110, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(104, Arrays.asList(new TerminalIdentifier[] {
+        map.put(140, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_FLOAT,
             WdlTerminalIdentifier.TERMINAL_INTEGER,
@@ -742,15 +742,18 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_NULL,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(89, Arrays.asList(new TerminalIdentifier[] {
+        map.put(102, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(129, Arrays.asList(new TerminalIdentifier[] {
+        map.put(85, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(127, Arrays.asList(new TerminalIdentifier[] {
+        map.put(90, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
+        }));
+        map.put(109, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -767,10 +770,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(80, Arrays.asList(new TerminalIdentifier[] {
-            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
-        }));
-        map.put(92, Arrays.asList(new TerminalIdentifier[] {
+        map.put(118, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -787,22 +787,22 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(109, Arrays.asList(new TerminalIdentifier[] {
+        map.put(74, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(141, Arrays.asList(new TerminalIdentifier[] {
+        map.put(112, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(122, Arrays.asList(new TerminalIdentifier[] {
+        map.put(126, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(124, Arrays.asList(new TerminalIdentifier[] {
+        map.put(82, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
         }));
-        map.put(120, Arrays.asList(new TerminalIdentifier[] {
+        map.put(87, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -813,44 +813,44 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(100, Arrays.asList(new TerminalIdentifier[] {
+        map.put(83, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
         }));
-        map.put(73, Arrays.asList(new TerminalIdentifier[] {
+        map.put(75, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_ATTR_HINT,
         }));
-        map.put(116, Arrays.asList(new TerminalIdentifier[] {
+        map.put(84, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(75, Arrays.asList(new TerminalIdentifier[] {
+        map.put(104, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
         }));
-        map.put(128, Arrays.asList(new TerminalIdentifier[] {
+        map.put(130, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
         }));
-        map.put(136, Arrays.asList(new TerminalIdentifier[] {
+        map.put(138, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INPUT,
         }));
-        map.put(105, Arrays.asList(new TerminalIdentifier[] {
+        map.put(71, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(95, Arrays.asList(new TerminalIdentifier[] {
+        map.put(113, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RAW_COMMAND,
         }));
-        map.put(88, Arrays.asList(new TerminalIdentifier[] {
+        map.put(91, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
         }));
-        map.put(139, Arrays.asList(new TerminalIdentifier[] {
+        map.put(93, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(130, Arrays.asList(new TerminalIdentifier[] {
+        map.put(141, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_VERSION,
         }));
-        map.put(135, Arrays.asList(new TerminalIdentifier[] {
+        map.put(133, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -867,44 +867,44 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(133, Arrays.asList(new TerminalIdentifier[] {
+        map.put(99, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
         }));
-        map.put(87, Arrays.asList(new TerminalIdentifier[] {
+        map.put(92, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_ATTR_HINT,
         }));
-        map.put(134, Arrays.asList(new TerminalIdentifier[] {
+        map.put(94, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(69, Arrays.asList(new TerminalIdentifier[] {
+        map.put(103, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IF,
         }));
-        map.put(86, Arrays.asList(new TerminalIdentifier[] {
+        map.put(105, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
         }));
-        map.put(82, Arrays.asList(new TerminalIdentifier[] {
+        map.put(117, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
         }));
-        map.put(91, Arrays.asList(new TerminalIdentifier[] {
+        map.put(88, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
         }));
-        map.put(125, Arrays.asList(new TerminalIdentifier[] {
+        map.put(123, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(76, Arrays.asList(new TerminalIdentifier[] {
+        map.put(72, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(83, Arrays.asList(new TerminalIdentifier[] {
+        map.put(89, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INPUT,
         }));
-        map.put(79, Arrays.asList(new TerminalIdentifier[] {
+        map.put(137, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(85, Arrays.asList(new TerminalIdentifier[] {
+        map.put(139, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -921,16 +921,16 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(126, Arrays.asList(new TerminalIdentifier[] {
+        map.put(132, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_META,
         }));
-        map.put(77, Arrays.asList(new TerminalIdentifier[] {
+        map.put(73, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(115, Arrays.asList(new TerminalIdentifier[] {
+        map.put(108, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(113, Arrays.asList(new TerminalIdentifier[] {
+        map.put(129, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_FLOAT,
             WdlTerminalIdentifier.TERMINAL_INTEGER,
@@ -940,59 +940,59 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_NULL,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(114, Arrays.asList(new TerminalIdentifier[] {
+        map.put(80, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(107, Arrays.asList(new TerminalIdentifier[] {
+        map.put(125, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(111, Arrays.asList(new TerminalIdentifier[] {
+        map.put(70, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_OUTPUT,
         }));
-        map.put(72, Arrays.asList(new TerminalIdentifier[] {
+        map.put(114, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_PARAMETER_META,
         }));
-        map.put(93, Arrays.asList(new TerminalIdentifier[] {
+        map.put(67, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(131, Arrays.asList(new TerminalIdentifier[] {
+        map.put(128, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RUNTIME,
         }));
-        map.put(103, Arrays.asList(new TerminalIdentifier[] {
+        map.put(115, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_SCATTER,
         }));
-        map.put(99, Arrays.asList(new TerminalIdentifier[] {
+        map.put(136, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_EQUAL,
         }));
-        map.put(106, Arrays.asList(new TerminalIdentifier[] {
+        map.put(120, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(118, Arrays.asList(new TerminalIdentifier[] {
+        map.put(111, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(97, Arrays.asList(new TerminalIdentifier[] {
+        map.put(127, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(102, Arrays.asList(new TerminalIdentifier[] {
+        map.put(86, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(90, Arrays.asList(new TerminalIdentifier[] {
+        map.put(76, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
         }));
-        map.put(112, Arrays.asList(new TerminalIdentifier[] {
+        map.put(78, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(68, Arrays.asList(new TerminalIdentifier[] {
+        map.put(121, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_TASK,
         }));
-        map.put(137, Arrays.asList(new TerminalIdentifier[] {
+        map.put(122, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1003,15 +1003,15 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(101, Arrays.asList(new TerminalIdentifier[] {
+        map.put(79, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(84, Arrays.asList(new TerminalIdentifier[] {
+        map.put(96, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_VERSION,
         }));
-        map.put(71, Arrays.asList(new TerminalIdentifier[] {
+        map.put(116, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1023,48 +1023,48 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(138, Arrays.asList(new TerminalIdentifier[] {
+        map.put(68, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_META,
         }));
-        map.put(108, Arrays.asList(new TerminalIdentifier[] {
+        map.put(134, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_PARAMETER_META,
         }));
-        map.put(94, Arrays.asList(new TerminalIdentifier[] {
+        map.put(69, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
         nonterminal_first = Collections.unmodifiableMap(map);
     }
     static {
         Map<Integer, List<TerminalIdentifier>> map = new HashMap<Integer, List<TerminalIdentifier>>();
-        map.put(96, Arrays.asList(new TerminalIdentifier[] {
+        map.put(81, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(98, Arrays.asList(new TerminalIdentifier[] {
+        map.put(77, Arrays.asList(new TerminalIdentifier[] {
         }));
-        map.put(121, Arrays.asList(new TerminalIdentifier[] {
+        map.put(124, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(74, Arrays.asList(new TerminalIdentifier[] {
+        map.put(97, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(110, Arrays.asList(new TerminalIdentifier[] {
+        map.put(106, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(70, Arrays.asList(new TerminalIdentifier[] {
+        map.put(101, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(67, Arrays.asList(new TerminalIdentifier[] {
+        map.put(119, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+        map.put(98, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(81, Arrays.asList(new TerminalIdentifier[] {
+        map.put(95, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1078,7 +1078,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(132, Arrays.asList(new TerminalIdentifier[] {
+        map.put(135, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1092,7 +1092,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(78, Arrays.asList(new TerminalIdentifier[] {
+        map.put(100, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1105,60 +1105,60 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(117, Arrays.asList(new TerminalIdentifier[] {
+        map.put(107, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(140, Arrays.asList(new TerminalIdentifier[] {
+        map.put(131, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(119, Arrays.asList(new TerminalIdentifier[] {
+        map.put(110, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(104, Arrays.asList(new TerminalIdentifier[] {
+        map.put(140, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(89, Arrays.asList(new TerminalIdentifier[] {
+        map.put(102, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(129, Arrays.asList(new TerminalIdentifier[] {
+        map.put(85, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(127, Arrays.asList(new TerminalIdentifier[] {
+        map.put(90, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_RBRACE,
+        }));
+        map.put(109, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RPAREN,
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(80, Arrays.asList(new TerminalIdentifier[] {
-            WdlTerminalIdentifier.TERMINAL_RBRACE,
-        }));
-        map.put(92, Arrays.asList(new TerminalIdentifier[] {
+        map.put(118, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(109, Arrays.asList(new TerminalIdentifier[] {
+        map.put(74, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(141, Arrays.asList(new TerminalIdentifier[] {
+        map.put(112, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(122, Arrays.asList(new TerminalIdentifier[] {
+        map.put(126, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(124, Arrays.asList(new TerminalIdentifier[] {
+        map.put(82, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(120, Arrays.asList(new TerminalIdentifier[] {
+        map.put(87, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(100, Arrays.asList(new TerminalIdentifier[] {
+        map.put(83, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RAW_CMD_END,
         }));
-        map.put(73, Arrays.asList(new TerminalIdentifier[] {
+        map.put(75, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -1175,7 +1175,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(116, Arrays.asList(new TerminalIdentifier[] {
+        map.put(84, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1189,7 +1189,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(75, Arrays.asList(new TerminalIdentifier[] {
+        map.put(104, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1202,7 +1202,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(128, Arrays.asList(new TerminalIdentifier[] {
+        map.put(130, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AFTER,
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1217,10 +1217,10 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(136, Arrays.asList(new TerminalIdentifier[] {
+        map.put(138, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(105, Arrays.asList(new TerminalIdentifier[] {
+        map.put(71, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1233,7 +1233,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(95, Arrays.asList(new TerminalIdentifier[] {
+        map.put(113, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1245,12 +1245,12 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(88, Arrays.asList(new TerminalIdentifier[] {
+        map.put(91, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_RAW_CMD_END,
         }));
-        map.put(139, Arrays.asList(new TerminalIdentifier[] {
+        map.put(93, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1265,9 +1265,9 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(130, Arrays.asList(new TerminalIdentifier[] {
+        map.put(141, Arrays.asList(new TerminalIdentifier[] {
         }));
-        map.put(135, Arrays.asList(new TerminalIdentifier[] {
+        map.put(133, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ASTERISK,
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_CALL,
@@ -1315,7 +1315,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(133, Arrays.asList(new TerminalIdentifier[] {
+        map.put(99, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CMD_PART,
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
@@ -1323,7 +1323,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_RAW_CMD_END,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(87, Arrays.asList(new TerminalIdentifier[] {
+        map.put(92, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_CMD_ATTR_HINT,
             WdlTerminalIdentifier.TERMINAL_DASH,
@@ -1341,12 +1341,12 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(134, Arrays.asList(new TerminalIdentifier[] {
+        map.put(94, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(69, Arrays.asList(new TerminalIdentifier[] {
+        map.put(103, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1359,37 +1359,37 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(86, Arrays.asList(new TerminalIdentifier[] {
+        map.put(105, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(82, Arrays.asList(new TerminalIdentifier[] {
+        map.put(117, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(91, Arrays.asList(new TerminalIdentifier[] {
+        map.put(88, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ALIAS,
             WdlTerminalIdentifier.TERMINAL_IMPORT,
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(125, Arrays.asList(new TerminalIdentifier[] {
+        map.put(123, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(76, Arrays.asList(new TerminalIdentifier[] {
+        map.put(72, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(83, Arrays.asList(new TerminalIdentifier[] {
+        map.put(89, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1404,15 +1404,15 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(79, Arrays.asList(new TerminalIdentifier[] {
+        map.put(137, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(85, Arrays.asList(new TerminalIdentifier[] {
+        map.put(139, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(126, Arrays.asList(new TerminalIdentifier[] {
+        map.put(132, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1424,12 +1424,12 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(77, Arrays.asList(new TerminalIdentifier[] {
+        map.put(73, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(115, Arrays.asList(new TerminalIdentifier[] {
+        map.put(108, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1444,23 +1444,23 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(113, Arrays.asList(new TerminalIdentifier[] {
+        map.put(129, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(114, Arrays.asList(new TerminalIdentifier[] {
+        map.put(80, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
         }));
-        map.put(107, Arrays.asList(new TerminalIdentifier[] {
+        map.put(125, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(111, Arrays.asList(new TerminalIdentifier[] {
+        map.put(70, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1475,7 +1475,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(72, Arrays.asList(new TerminalIdentifier[] {
+        map.put(114, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1487,7 +1487,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(93, Arrays.asList(new TerminalIdentifier[] {
+        map.put(67, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1499,7 +1499,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(131, Arrays.asList(new TerminalIdentifier[] {
+        map.put(128, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1511,7 +1511,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(103, Arrays.asList(new TerminalIdentifier[] {
+        map.put(115, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1524,7 +1524,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(99, Arrays.asList(new TerminalIdentifier[] {
+        map.put(136, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1539,7 +1539,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(106, Arrays.asList(new TerminalIdentifier[] {
+        map.put(120, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_AS,
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
@@ -1550,13 +1550,13 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(118, Arrays.asList(new TerminalIdentifier[] {
+        map.put(111, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(97, Arrays.asList(new TerminalIdentifier[] {
+        map.put(127, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ASTERISK,
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_CALL,
@@ -1604,29 +1604,29 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(102, Arrays.asList(new TerminalIdentifier[] {
+        map.put(86, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_ESCAPE,
             WdlTerminalIdentifier.TERMINAL_EXPRESSION_PLACEHOLDER_START,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
             WdlTerminalIdentifier.TERMINAL_STRING,
         }));
-        map.put(90, Arrays.asList(new TerminalIdentifier[] {
+        map.put(76, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(112, Arrays.asList(new TerminalIdentifier[] {
+        map.put(78, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RBRACE,
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(68, Arrays.asList(new TerminalIdentifier[] {
+        map.put(121, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
         }));
-        map.put(137, Arrays.asList(new TerminalIdentifier[] {
+        map.put(122, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_INPUT,
             WdlTerminalIdentifier.TERMINAL_META,
@@ -1638,15 +1638,15 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(101, Arrays.asList(new TerminalIdentifier[] {
+        map.put(79, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_COMMA,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_RSQUARE,
         }));
-        map.put(84, Arrays.asList(new TerminalIdentifier[] {
+        map.put(96, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IMPORT,
         }));
-        map.put(71, Arrays.asList(new TerminalIdentifier[] {
+        map.put(116, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1659,7 +1659,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(138, Arrays.asList(new TerminalIdentifier[] {
+        map.put(68, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1672,7 +1672,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(108, Arrays.asList(new TerminalIdentifier[] {
+        map.put(134, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_CALL,
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
             WdlTerminalIdentifier.TERMINAL_IF,
@@ -1685,7 +1685,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE,
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
-        map.put(94, Arrays.asList(new TerminalIdentifier[] {
+        map.put(69, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_STRUCT,
             WdlTerminalIdentifier.TERMINAL_TASK,
             WdlTerminalIdentifier.TERMINAL_WORKFLOW,
@@ -1780,6 +1780,9 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_TYPE_E,
         }));
         map.put(120, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
+        }));
+        map.put(122, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -1796,10 +1799,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(124, Arrays.asList(new TerminalIdentifier[] {
-            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
-        }));
-        map.put(127, Arrays.asList(new TerminalIdentifier[] {
+        map.put(128, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -2104,7 +2104,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+        map.put(125, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -2121,7 +2121,7 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(122, Arrays.asList(new TerminalIdentifier[] {
+        map.put(124, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
             WdlTerminalIdentifier.TERMINAL_DASH,
             WdlTerminalIdentifier.TERMINAL_E,
@@ -2138,46 +2138,49 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
             WdlTerminalIdentifier.TERMINAL_PLUS,
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(131, Arrays.asList(new TerminalIdentifier[] {
+        map.put(132, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_QUOTE,
         }));
-        map.put(133, Arrays.asList(new TerminalIdentifier[] {
+        map.put(134, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_BOOLEAN,
         }));
         map.put(119, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_DASH,
         }));
-        map.put(135, Arrays.asList(new TerminalIdentifier[] {
+        map.put(136, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_FLOAT,
         }));
-        map.put(132, Arrays.asList(new TerminalIdentifier[] {
+        map.put(133, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
         map.put(121, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
         }));
-        map.put(130, Arrays.asList(new TerminalIdentifier[] {
+        map.put(123, Arrays.asList(new TerminalIdentifier[] {
+            WdlTerminalIdentifier.TERMINAL_IDENTIFIER,
+        }));
+        map.put(131, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_IF,
         }));
-        map.put(134, Arrays.asList(new TerminalIdentifier[] {
+        map.put(135, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_INTEGER,
         }));
-        map.put(128, Arrays.asList(new TerminalIdentifier[] {
+        map.put(129, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LBRACE,
         }));
-        map.put(129, Arrays.asList(new TerminalIdentifier[] {
+        map.put(130, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LPAREN,
         }));
-        map.put(126, Arrays.asList(new TerminalIdentifier[] {
+        map.put(127, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_LSQUARE,
         }));
-        map.put(136, Arrays.asList(new TerminalIdentifier[] {
+        map.put(137, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_NONE,
         }));
         map.put(117, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_NOT,
         }));
-        map.put(125, Arrays.asList(new TerminalIdentifier[] {
+        map.put(126, Arrays.asList(new TerminalIdentifier[] {
             WdlTerminalIdentifier.TERMINAL_OBJECT,
         }));
         map.put(118, Arrays.asList(new TerminalIdentifier[] {
@@ -2407,218 +2410,219 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
     }
     static {
         Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
-        map.put(96, new ArrayList<String>());
+        map.put(81, new ArrayList<String>());
+        map.put(77, new ArrayList<String>());
+        map.put(124, new ArrayList<String>());
+        map.put(97, new ArrayList<String>());
+        map.put(106, new ArrayList<String>());
+        map.put(101, new ArrayList<String>());
+        map.put(119, new ArrayList<String>());
         map.put(98, new ArrayList<String>());
-        map.put(121, new ArrayList<String>());
-        map.put(74, new ArrayList<String>());
+        map.put(95, new ArrayList<String>());
+        map.put(135, new ArrayList<String>());
+        map.put(100, new ArrayList<String>());
+        map.put(107, new ArrayList<String>());
+        map.put(131, new ArrayList<String>());
         map.put(110, new ArrayList<String>());
-        map.put(70, new ArrayList<String>());
-        map.put(67, new ArrayList<String>());
-        map.put(123, new ArrayList<String>());
-        map.put(81, new ArrayList<String>());
-        map.put(132, new ArrayList<String>());
-        map.put(78, new ArrayList<String>());
-        map.put(117, new ArrayList<String>());
         map.put(140, new ArrayList<String>());
-        map.put(119, new ArrayList<String>());
+        map.put(102, new ArrayList<String>());
+        map.put(85, new ArrayList<String>());
+        map.put(90, new ArrayList<String>());
+        map.put(109, new ArrayList<String>());
+        map.put(118, new ArrayList<String>());
+        map.put(74, new ArrayList<String>());
+        map.put(112, new ArrayList<String>());
+        map.put(126, new ArrayList<String>());
+        map.put(82, new ArrayList<String>());
+        map.put(87, new ArrayList<String>());
+        map.put(83, new ArrayList<String>());
+        map.put(75, new ArrayList<String>());
+        map.put(84, new ArrayList<String>());
         map.put(104, new ArrayList<String>());
+        map.put(130, new ArrayList<String>());
+        map.put(138, new ArrayList<String>());
+        map.put(71, new ArrayList<String>());
+        map.put(113, new ArrayList<String>());
+        map.put(91, new ArrayList<String>());
+        map.put(93, new ArrayList<String>());
+        map.put(141, new ArrayList<String>());
+        map.put(133, new ArrayList<String>());
+        map.put(99, new ArrayList<String>());
+        map.put(92, new ArrayList<String>());
+        map.put(94, new ArrayList<String>());
+        map.put(103, new ArrayList<String>());
+        map.put(105, new ArrayList<String>());
+        map.put(117, new ArrayList<String>());
+        map.put(88, new ArrayList<String>());
+        map.put(123, new ArrayList<String>());
+        map.put(72, new ArrayList<String>());
         map.put(89, new ArrayList<String>());
+        map.put(137, new ArrayList<String>());
+        map.put(139, new ArrayList<String>());
+        map.put(132, new ArrayList<String>());
+        map.put(73, new ArrayList<String>());
+        map.put(108, new ArrayList<String>());
         map.put(129, new ArrayList<String>());
-        map.put(127, new ArrayList<String>());
         map.put(80, new ArrayList<String>());
-        map.put(92, new ArrayList<String>());
-        map.put(109, new ArrayList<String>());
-        map.put(141, new ArrayList<String>());
-        map.put(122, new ArrayList<String>());
-        map.put(124, new ArrayList<String>());
-        map.put(120, new ArrayList<String>());
-        map.put(100, new ArrayList<String>());
-        map.put(73, new ArrayList<String>());
-        map.put(116, new ArrayList<String>());
-        map.put(75, new ArrayList<String>());
+        map.put(125, new ArrayList<String>());
+        map.put(70, new ArrayList<String>());
+        map.put(114, new ArrayList<String>());
+        map.put(67, new ArrayList<String>());
         map.put(128, new ArrayList<String>());
+        map.put(115, new ArrayList<String>());
         map.put(136, new ArrayList<String>());
-        map.put(105, new ArrayList<String>());
-        map.put(95, new ArrayList<String>());
-        map.put(88, new ArrayList<String>());
-        map.put(139, new ArrayList<String>());
-        map.put(130, new ArrayList<String>());
-        map.put(135, new ArrayList<String>());
-        map.put(133, new ArrayList<String>());
-        map.put(87, new ArrayList<String>());
-        map.put(134, new ArrayList<String>());
-        map.put(69, new ArrayList<String>());
+        map.put(120, new ArrayList<String>());
+        map.put(111, new ArrayList<String>());
+        map.put(127, new ArrayList<String>());
         map.put(86, new ArrayList<String>());
-        map.put(82, new ArrayList<String>());
-        map.put(91, new ArrayList<String>());
-        map.put(125, new ArrayList<String>());
         map.put(76, new ArrayList<String>());
-        map.put(83, new ArrayList<String>());
+        map.put(78, new ArrayList<String>());
+        map.put(121, new ArrayList<String>());
+        map.put(122, new ArrayList<String>());
         map.put(79, new ArrayList<String>());
-        map.put(85, new ArrayList<String>());
-        map.put(126, new ArrayList<String>());
-        map.put(77, new ArrayList<String>());
-        map.put(115, new ArrayList<String>());
-        map.put(113, new ArrayList<String>());
-        map.put(114, new ArrayList<String>());
-        map.put(107, new ArrayList<String>());
-        map.put(111, new ArrayList<String>());
-        map.put(72, new ArrayList<String>());
-        map.put(93, new ArrayList<String>());
-        map.put(131, new ArrayList<String>());
-        map.put(103, new ArrayList<String>());
-        map.put(99, new ArrayList<String>());
-        map.put(106, new ArrayList<String>());
-        map.put(118, new ArrayList<String>());
-        map.put(97, new ArrayList<String>());
-        map.put(102, new ArrayList<String>());
-        map.put(90, new ArrayList<String>());
-        map.put(112, new ArrayList<String>());
+        map.put(96, new ArrayList<String>());
+        map.put(116, new ArrayList<String>());
         map.put(68, new ArrayList<String>());
-        map.put(137, new ArrayList<String>());
-        map.put(101, new ArrayList<String>());
-        map.put(84, new ArrayList<String>());
-        map.put(71, new ArrayList<String>());
-        map.put(138, new ArrayList<String>());
-        map.put(108, new ArrayList<String>());
-        map.put(94, new ArrayList<String>());
-        map.get(96).add("$_gen0 = list($import)");
-        map.get(98).add("$_gen1 = list($file_body_element)");
-        map.get(121).add("$_gen10 = list($input_declaration)");
-        map.get(74).add("$_gen11 = list($kv)");
-        map.get(110).add("$_gen12 = list($meta_kv)");
-        map.get(70).add("$_gen13 = $setter");
-        map.get(70).add("$_gen13 = :_empty");
-        map.get(67).add("$_gen14 = list($output_kv)");
-        map.get(123).add("$_gen15 = list($wf_body_element)");
-        map.get(81).add("$_gen16 = $alias");
-        map.get(81).add("$_gen16 = :_empty");
-        map.get(132).add("$_gen17 = list($call_after)");
-        map.get(78).add("$_gen18 = $call_brace_block");
-        map.get(78).add("$_gen18 = :_empty");
-        map.get(117).add("$_gen19 = $call_body");
-        map.get(117).add("$_gen19 = :_empty");
-        map.get(140).add("$_gen2 = list($struct_declaration)");
-        map.get(119).add("$_gen20 = list($input_kv, :comma)");
-        map.get(104).add("$_gen21 = list($meta_value, :comma)");
-        map.get(89).add("$_gen22 = list($meta_kv, :comma)");
-        map.get(129).add("$_gen23 = list($type_e, :comma)");
-        map.get(127).add("$_gen24 = list($e, :comma)");
-        map.get(80).add("$_gen25 = list($object_kv, :comma)");
-        map.get(92).add("$_gen26 = list($map_kv, :comma)");
-        map.get(109).add("$_gen3 = list($static_string_piece)");
-        map.get(141).add("$_gen4 = list($string_piece)");
-        map.get(122).add("$_gen5 = $import_namespace");
-        map.get(122).add("$_gen5 = :_empty");
-        map.get(124).add("$_gen6 = list($import_alias)");
-        map.get(120).add("$_gen7 = list($task_sections)");
-        map.get(100).add("$_gen8 = list($command_part)");
-        map.get(73).add("$_gen9 = list($expression_placeholder_kv)");
-        map.get(116).add("$alias = :as :identifier -> $1");
-        map.get(75).add("$call = :call :fqn $_gen16 $_gen17 $_gen18 -> Call( task=$1, alias=$2, after=$3, body=$4 )");
-        map.get(128).add("$call_after = :after :identifier -> $1");
-        map.get(136).add("$call_body = :input :colon $_gen20 -> CallBody( inputs=$2 )");
-        map.get(105).add("$call_brace_block = :lbrace $_gen19 :rbrace -> $1");
-        map.get(95).add("$command = :raw_command :raw_cmd_start $_gen8 :raw_cmd_end -> RawCommand( parts=$2 )");
-        map.get(88).add("$command_part = $expression_placeholder");
-        map.get(88).add("$command_part = :cmd_part");
-        map.get(139).add("$declaration = $type_e :identifier $setter -> Declaration( type=$0, name=$1, expression=$2 )");
-        map.get(130).add("$document = $version $_gen0 $_gen1 -> Draft3File( version=$0, imports=$1, body=$2 )");
-        map.get(135).add("$e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
-        map.get(135).add("$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
-        map.get(135).add("$e = $string_literal");
-        map.get(135).add("$e = :boolean");
-        map.get(135).add("$e = :dash $e -> UnaryNegation( expression=$1 )");
-        map.get(135).add("$e = :float");
-        map.get(135).add("$e = :identifier");
-        map.get(135).add("$e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 )");
-        map.get(135).add("$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
-        map.get(135).add("$e = :integer");
-        map.get(135).add("$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
-        map.get(135).add("$e = :lparen $_gen24 :rparen -> TupleLiteral( values=$1 )");
-        map.get(135).add("$e = :lsquare $_gen24 :rsquare -> ArrayLiteral( values=$1 )");
-        map.get(135).add("$e = :none");
-        map.get(135).add("$e = :not $e -> LogicalNot( expression=$1 )");
-        map.get(135).add("$e = :object :lbrace $_gen25 :rbrace -> ObjectLiteral( map=$2 )");
-        map.get(135).add("$e = :plus $e -> UnaryPlus( expression=$1 )");
-        map.get(133).add("$expression_placeholder = :expression_placeholder_start $_gen9 $e :expression_placeholder_end -> ExpressionPlaceholder( attributes=$1, expr=$2 )");
-        map.get(87).add("$expression_placeholder_kv = :cmd_attr_hint :identifier :equal $e -> ExpressionPlaceholderAttr( key=$1, value=$3 )");
-        map.get(134).add("$file_body_element = $struct");
-        map.get(134).add("$file_body_element = $task");
-        map.get(134).add("$file_body_element = $workflow");
-        map.get(69).add("$if_stmt = :if :lparen $e :rparen :lbrace $_gen15 :rbrace -> If( expression=$2, body=$5 )");
-        map.get(86).add("$import = :import $static_string $_gen5 $_gen6 -> Import( uri=$1, namespace=$2, aliases=$3 )");
-        map.get(82).add("$import_alias = :alias :identifier :as :identifier -> ImportAlias( old_name=$1, new_name=$3 )");
-        map.get(91).add("$import_namespace = :as :identifier -> $1");
-        map.get(125).add("$input_declaration = $type_e :identifier $_gen13 -> InputDeclaration( type=$0, name=$1, expression=$2 )");
-        map.get(76).add("$input_kv = :identifier :equal $e -> ObjectKV( key=$0, value=$2 )");
-        map.get(83).add("$inputs = :input :lbrace $_gen10 :rbrace -> Inputs( inputs=$2 )");
-        map.get(79).add("$kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 )");
-        map.get(85).add("$map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 )");
-        map.get(126).add("$meta = :meta $meta_map -> Meta( map=$1 )");
-        map.get(77).add("$meta_kv = :identifier :colon $meta_value -> MetaKvPair( key=$0, value=$2 )");
-        map.get(115).add("$meta_map = :lbrace $_gen12 :rbrace -> $1");
-        map.get(113).add("$meta_value = $static_string");
-        map.get(113).add("$meta_value = :boolean");
-        map.get(113).add("$meta_value = :float");
-        map.get(113).add("$meta_value = :integer");
-        map.get(113).add("$meta_value = :lbrace $_gen22 :rbrace -> MetaObject( map=$1 )");
-        map.get(113).add("$meta_value = :lsquare $_gen21 :rsquare -> MetaArray( values=$1 )");
-        map.get(113).add("$meta_value = :null");
-        map.get(114).add("$object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 )");
-        map.get(107).add("$output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 )");
-        map.get(111).add("$outputs = :output :lbrace $_gen14 :rbrace -> Outputs( outputs=$2 )");
-        map.get(72).add("$parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
-        map.get(93).add("$rt_map = :lbrace $_gen11 :rbrace -> $1");
-        map.get(131).add("$runtime = :runtime $rt_map -> Runtime( map=$1 )");
-        map.get(103).add("$scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen15 :rbrace -> Scatter( item=$2, collection=$4, body=$7 )");
-        map.get(99).add("$setter = :equal $e -> $1");
-        map.get(106).add("$static_string = :quote $_gen3 :quote -> StaticString( value=$1 )");
-        map.get(118).add("$static_string_piece = :escape");
-        map.get(118).add("$static_string_piece = :string");
-        map.get(97).add("$string_literal = :quote $_gen4 :quote -> StringLiteral( pieces=$1 )");
-        map.get(102).add("$string_piece = $expression_placeholder");
-        map.get(102).add("$string_piece = $static_string_piece");
-        map.get(90).add("$struct = :struct :identifier :lbrace $_gen2 :rbrace -> Struct( name=$1, entries=$3 )");
-        map.get(112).add("$struct_declaration = $type_e :identifier -> StructEntry( type=$0, name=$1 )");
-        map.get(68).add("$task = :task :identifier :lbrace $_gen7 :rbrace -> Task( name=$1, sections=$3 )");
-        map.get(137).add("$task_sections = $command");
-        map.get(137).add("$task_sections = $declaration");
-        map.get(137).add("$task_sections = $inputs");
-        map.get(137).add("$task_sections = $meta");
-        map.get(137).add("$task_sections = $outputs");
-        map.get(137).add("$task_sections = $parameter_meta");
-        map.get(137).add("$task_sections = $runtime");
-        map.get(101).add("$type_e = :identifier");
-        map.get(101).add("$type_e = :type");
-        map.get(101).add("$type_e = :type <=> :lsquare $_gen23 :rsquare -> Type( name=$0, subtype=$2 )");
-        map.get(101).add("$type_e = :type <=> :plus -> NonEmptyType( innerType=$0 )");
-        map.get(101).add("$type_e = :type <=> :qmark -> OptionalType( innerType=$0 )");
-        map.get(84).add("$version = :version :version_name -> VersionDeclaration( v=$1 )");
-        map.get(71).add("$wf_body_element = $call");
-        map.get(71).add("$wf_body_element = $declaration");
-        map.get(71).add("$wf_body_element = $if_stmt");
-        map.get(71).add("$wf_body_element = $inputs");
-        map.get(71).add("$wf_body_element = $outputs");
-        map.get(71).add("$wf_body_element = $scatter");
-        map.get(71).add("$wf_body_element = $wf_meta");
-        map.get(71).add("$wf_body_element = $wf_parameter_meta");
-        map.get(138).add("$wf_meta = :meta $meta_map -> Meta( map=$1 )");
-        map.get(108).add("$wf_parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
-        map.get(94).add("$workflow = :workflow :identifier :lbrace $_gen15 :rbrace -> Workflow( name=$1, body=$3 )");
+        map.put(134, new ArrayList<String>());
+        map.put(69, new ArrayList<String>());
+        map.get(81).add("$_gen0 = list($import)");
+        map.get(77).add("$_gen1 = list($file_body_element)");
+        map.get(124).add("$_gen10 = list($input_declaration)");
+        map.get(97).add("$_gen11 = list($kv)");
+        map.get(106).add("$_gen12 = list($meta_kv)");
+        map.get(101).add("$_gen13 = $setter");
+        map.get(101).add("$_gen13 = :_empty");
+        map.get(119).add("$_gen14 = list($output_kv)");
+        map.get(98).add("$_gen15 = list($wf_body_element)");
+        map.get(95).add("$_gen16 = $alias");
+        map.get(95).add("$_gen16 = :_empty");
+        map.get(135).add("$_gen17 = list($call_after)");
+        map.get(100).add("$_gen18 = $call_brace_block");
+        map.get(100).add("$_gen18 = :_empty");
+        map.get(107).add("$_gen19 = $call_body");
+        map.get(107).add("$_gen19 = :_empty");
+        map.get(131).add("$_gen2 = list($struct_declaration)");
+        map.get(110).add("$_gen20 = list($input_kv, :comma)");
+        map.get(140).add("$_gen21 = list($meta_value, :comma)");
+        map.get(102).add("$_gen22 = list($meta_kv, :comma)");
+        map.get(85).add("$_gen23 = list($type_e, :comma)");
+        map.get(90).add("$_gen24 = list($object_kv, :comma)");
+        map.get(109).add("$_gen25 = list($e, :comma)");
+        map.get(118).add("$_gen26 = list($map_kv, :comma)");
+        map.get(74).add("$_gen3 = list($static_string_piece)");
+        map.get(112).add("$_gen4 = list($string_piece)");
+        map.get(126).add("$_gen5 = $import_namespace");
+        map.get(126).add("$_gen5 = :_empty");
+        map.get(82).add("$_gen6 = list($import_alias)");
+        map.get(87).add("$_gen7 = list($task_sections)");
+        map.get(83).add("$_gen8 = list($command_part)");
+        map.get(75).add("$_gen9 = list($expression_placeholder_kv)");
+        map.get(84).add("$alias = :as :identifier -> $1");
+        map.get(104).add("$call = :call :fqn $_gen16 $_gen17 $_gen18 -> Call( task=$1, alias=$2, after=$3, body=$4 )");
+        map.get(130).add("$call_after = :after :identifier -> $1");
+        map.get(138).add("$call_body = :input :colon $_gen20 -> CallBody( inputs=$2 )");
+        map.get(71).add("$call_brace_block = :lbrace $_gen19 :rbrace -> $1");
+        map.get(113).add("$command = :raw_command :raw_cmd_start $_gen8 :raw_cmd_end -> RawCommand( parts=$2 )");
+        map.get(91).add("$command_part = $expression_placeholder");
+        map.get(91).add("$command_part = :cmd_part");
+        map.get(93).add("$declaration = $type_e :identifier $setter -> Declaration( type=$0, name=$1, expression=$2 )");
+        map.get(141).add("$document = $version $_gen0 $_gen1 -> Draft3File( version=$0, imports=$1, body=$2 )");
+        map.get(133).add("$e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
+        map.get(133).add("$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
+        map.get(133).add("$e = $string_literal");
+        map.get(133).add("$e = :boolean");
+        map.get(133).add("$e = :dash $e -> UnaryNegation( expression=$1 )");
+        map.get(133).add("$e = :float");
+        map.get(133).add("$e = :identifier");
+        map.get(133).add("$e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 )");
+        map.get(133).add("$e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 )");
+        map.get(133).add("$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
+        map.get(133).add("$e = :integer");
+        map.get(133).add("$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
+        map.get(133).add("$e = :lparen $_gen25 :rparen -> TupleLiteral( values=$1 )");
+        map.get(133).add("$e = :lsquare $_gen25 :rsquare -> ArrayLiteral( values=$1 )");
+        map.get(133).add("$e = :none");
+        map.get(133).add("$e = :not $e -> LogicalNot( expression=$1 )");
+        map.get(133).add("$e = :object :lbrace $_gen24 :rbrace -> ObjectLiteral( map=$2 )");
+        map.get(133).add("$e = :plus $e -> UnaryPlus( expression=$1 )");
+        map.get(99).add("$expression_placeholder = :expression_placeholder_start $_gen9 $e :expression_placeholder_end -> ExpressionPlaceholder( attributes=$1, expr=$2 )");
+        map.get(92).add("$expression_placeholder_kv = :cmd_attr_hint :identifier :equal $e -> ExpressionPlaceholderAttr( key=$1, value=$3 )");
+        map.get(94).add("$file_body_element = $struct");
+        map.get(94).add("$file_body_element = $task");
+        map.get(94).add("$file_body_element = $workflow");
+        map.get(103).add("$if_stmt = :if :lparen $e :rparen :lbrace $_gen15 :rbrace -> If( expression=$2, body=$5 )");
+        map.get(105).add("$import = :import $static_string $_gen5 $_gen6 -> Import( uri=$1, namespace=$2, aliases=$3 )");
+        map.get(117).add("$import_alias = :alias :identifier :as :identifier -> ImportAlias( old_name=$1, new_name=$3 )");
+        map.get(88).add("$import_namespace = :as :identifier -> $1");
+        map.get(123).add("$input_declaration = $type_e :identifier $_gen13 -> InputDeclaration( type=$0, name=$1, expression=$2 )");
+        map.get(72).add("$input_kv = :identifier :equal $e -> ObjectKV( key=$0, value=$2 )");
+        map.get(89).add("$inputs = :input :lbrace $_gen10 :rbrace -> Inputs( inputs=$2 )");
+        map.get(137).add("$kv = :identifier :colon $e -> RuntimeAttribute( key=$0, value=$2 )");
+        map.get(139).add("$map_kv = $e :colon $e -> MapLiteralKv( key=$0, value=$2 )");
+        map.get(132).add("$meta = :meta $meta_map -> Meta( map=$1 )");
+        map.get(73).add("$meta_kv = :identifier :colon $meta_value -> MetaKvPair( key=$0, value=$2 )");
+        map.get(108).add("$meta_map = :lbrace $_gen12 :rbrace -> $1");
+        map.get(129).add("$meta_value = $static_string");
+        map.get(129).add("$meta_value = :boolean");
+        map.get(129).add("$meta_value = :float");
+        map.get(129).add("$meta_value = :integer");
+        map.get(129).add("$meta_value = :lbrace $_gen22 :rbrace -> MetaObject( map=$1 )");
+        map.get(129).add("$meta_value = :lsquare $_gen21 :rsquare -> MetaArray( values=$1 )");
+        map.get(129).add("$meta_value = :null");
+        map.get(80).add("$object_kv = :identifier :colon $e -> ObjectKV( key=$0, value=$2 )");
+        map.get(125).add("$output_kv = $type_e :identifier :equal $e -> Output( type=$0, name=$1, expression=$3 )");
+        map.get(70).add("$outputs = :output :lbrace $_gen14 :rbrace -> Outputs( outputs=$2 )");
+        map.get(114).add("$parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
+        map.get(67).add("$rt_map = :lbrace $_gen11 :rbrace -> $1");
+        map.get(128).add("$runtime = :runtime $rt_map -> Runtime( map=$1 )");
+        map.get(115).add("$scatter = :scatter :lparen :identifier :in $e :rparen :lbrace $_gen15 :rbrace -> Scatter( item=$2, collection=$4, body=$7 )");
+        map.get(136).add("$setter = :equal $e -> $1");
+        map.get(120).add("$static_string = :quote $_gen3 :quote -> StaticString( value=$1 )");
+        map.get(111).add("$static_string_piece = :escape");
+        map.get(111).add("$static_string_piece = :string");
+        map.get(127).add("$string_literal = :quote $_gen4 :quote -> StringLiteral( pieces=$1 )");
+        map.get(86).add("$string_piece = $expression_placeholder");
+        map.get(86).add("$string_piece = $static_string_piece");
+        map.get(76).add("$struct = :struct :identifier :lbrace $_gen2 :rbrace -> Struct( name=$1, entries=$3 )");
+        map.get(78).add("$struct_declaration = $type_e :identifier -> StructEntry( type=$0, name=$1 )");
+        map.get(121).add("$task = :task :identifier :lbrace $_gen7 :rbrace -> Task( name=$1, sections=$3 )");
+        map.get(122).add("$task_sections = $command");
+        map.get(122).add("$task_sections = $declaration");
+        map.get(122).add("$task_sections = $inputs");
+        map.get(122).add("$task_sections = $meta");
+        map.get(122).add("$task_sections = $outputs");
+        map.get(122).add("$task_sections = $parameter_meta");
+        map.get(122).add("$task_sections = $runtime");
+        map.get(79).add("$type_e = :identifier");
+        map.get(79).add("$type_e = :type");
+        map.get(79).add("$type_e = :type <=> :lsquare $_gen23 :rsquare -> Type( name=$0, subtype=$2 )");
+        map.get(79).add("$type_e = :type <=> :plus -> NonEmptyType( innerType=$0 )");
+        map.get(79).add("$type_e = :type <=> :qmark -> OptionalType( innerType=$0 )");
+        map.get(96).add("$version = :version :version_name -> VersionDeclaration( v=$1 )");
+        map.get(116).add("$wf_body_element = $call");
+        map.get(116).add("$wf_body_element = $declaration");
+        map.get(116).add("$wf_body_element = $if_stmt");
+        map.get(116).add("$wf_body_element = $inputs");
+        map.get(116).add("$wf_body_element = $outputs");
+        map.get(116).add("$wf_body_element = $scatter");
+        map.get(116).add("$wf_body_element = $wf_meta");
+        map.get(116).add("$wf_body_element = $wf_parameter_meta");
+        map.get(68).add("$wf_meta = :meta $meta_map -> Meta( map=$1 )");
+        map.get(134).add("$wf_parameter_meta = :parameter_meta $meta_map -> ParameterMeta( map=$1 )");
+        map.get(69).add("$workflow = :workflow :identifier :lbrace $_gen15 :rbrace -> Workflow( name=$1, body=$3 )");
         nonterminal_rules = Collections.unmodifiableMap(map);
     }
     static {
@@ -2644,9 +2648,9 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
         map.put(new Integer(94), "$_gen21 = list($meta_value, :comma)");
         map.put(new Integer(96), "$_gen22 = list($meta_kv, :comma)");
         map.put(new Integer(98), "$_gen23 = list($type_e, :comma)");
-        map.put(new Integer(120), "$_gen24 = list($e, :comma)");
-        map.put(new Integer(124), "$_gen25 = list($object_kv, :comma)");
-        map.put(new Integer(127), "$_gen26 = list($map_kv, :comma)");
+        map.put(new Integer(120), "$_gen24 = list($object_kv, :comma)");
+        map.put(new Integer(122), "$_gen25 = list($e, :comma)");
+        map.put(new Integer(128), "$_gen26 = list($map_kv, :comma)");
         map.put(new Integer(10), "$_gen3 = list($static_string_piece)");
         map.put(new Integer(12), "$_gen4 = list($string_piece)");
         map.put(new Integer(18), "$_gen5 = $import_namespace");
@@ -2678,22 +2682,23 @@ public enum WdlTerminalIdentifier implements TerminalIdentifier {
         map.put(new Integer(116), "$e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 )");
         map.put(new Integer(112), "$e = $e :plus $e -> Add( lhs=$0, rhs=$2 )");
         map.put(new Integer(115), "$e = $e :slash $e -> Divide( lhs=$0, rhs=$2 )");
-        map.put(new Integer(123), "$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
-        map.put(new Integer(122), "$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
-        map.put(new Integer(131), "$e = $string_literal");
-        map.put(new Integer(133), "$e = :boolean");
+        map.put(new Integer(125), "$e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 )");
+        map.put(new Integer(124), "$e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 )");
+        map.put(new Integer(132), "$e = $string_literal");
+        map.put(new Integer(134), "$e = :boolean");
         map.put(new Integer(119), "$e = :dash $e -> UnaryNegation( expression=$1 )");
-        map.put(new Integer(135), "$e = :float");
-        map.put(new Integer(132), "$e = :identifier");
-        map.put(new Integer(121), "$e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 )");
-        map.put(new Integer(130), "$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
-        map.put(new Integer(134), "$e = :integer");
-        map.put(new Integer(128), "$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
-        map.put(new Integer(129), "$e = :lparen $_gen24 :rparen -> TupleLiteral( values=$1 )");
-        map.put(new Integer(126), "$e = :lsquare $_gen24 :rsquare -> ArrayLiteral( values=$1 )");
-        map.put(new Integer(136), "$e = :none");
+        map.put(new Integer(136), "$e = :float");
+        map.put(new Integer(133), "$e = :identifier");
+        map.put(new Integer(121), "$e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 )");
+        map.put(new Integer(123), "$e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 )");
+        map.put(new Integer(131), "$e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 )");
+        map.put(new Integer(135), "$e = :integer");
+        map.put(new Integer(129), "$e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 )");
+        map.put(new Integer(130), "$e = :lparen $_gen25 :rparen -> TupleLiteral( values=$1 )");
+        map.put(new Integer(127), "$e = :lsquare $_gen25 :rsquare -> ArrayLiteral( values=$1 )");
+        map.put(new Integer(137), "$e = :none");
         map.put(new Integer(117), "$e = :not $e -> LogicalNot( expression=$1 )");
-        map.put(new Integer(125), "$e = :object :lbrace $_gen25 :rbrace -> ObjectLiteral( map=$2 )");
+        map.put(new Integer(126), "$e = :object :lbrace $_gen24 :rbrace -> ObjectLiteral( map=$2 )");
         map.put(new Integer(118), "$e = :plus $e -> UnaryPlus( expression=$1 )");
         map.put(new Integer(38), "$expression_placeholder = :expression_placeholder_start $_gen9 $e :expression_placeholder_end -> ExpressionPlaceholder( attributes=$1, expr=$2 )");
         map.put(new Integer(39), "$expression_placeholder_kv = :cmd_attr_hint :identifier :equal $e -> ExpressionPlaceholderAttr( key=$1, value=$3 )");
@@ -2803,29 +2808,30 @@ private static Terminal expect(ParserContext ctx, TerminalIdentifier expecting)
     private static Map<Integer, Integer> prefix_binding_power_e;
     static {
         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
-        map.put(25, 4000); /* $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) */
-        map.put(13, 5000); /* $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) */
-        map.put(24, 6000); /* $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) */
-        map.put(14, 6000); /* $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) */
-        map.put(65, 7000); /* $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) */
-        map.put(1, 7000); /* $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) */
-        map.put(4, 7000); /* $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) */
-        map.put(21, 7000); /* $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) */
-        map.put(9, 8000); /* $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) */
-        map.put(63, 8000); /* $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) */
-        map.put(3, 9000); /* $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) */
-        map.put(29, 9000); /* $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) */
-        map.put(5, 9000); /* $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) */
-        map.put(12, 11000); /* $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall( name=$0, params=$2 ) */
-        map.put(51, 12000); /* $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) */
-        map.put(62, 13000); /* $e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 ) */
+        map.put(49, 4000); /* $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) */
+        map.put(8, 5000); /* $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) */
+        map.put(56, 6000); /* $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) */
+        map.put(63, 6000); /* $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) */
+        map.put(37, 7000); /* $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) */
+        map.put(11, 7000); /* $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) */
+        map.put(2, 7000); /* $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) */
+        map.put(3, 7000); /* $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) */
+        map.put(12, 8000); /* $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) */
+        map.put(53, 8000); /* $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) */
+        map.put(34, 9000); /* $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) */
+        map.put(20, 9000); /* $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) */
+        map.put(22, 9000); /* $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) */
+        map.put(50, 11000); /* $e = :identifier <=> :lbrace list($object_kv, :comma) :rbrace -> StructLiteral( name=$0, map=$2 ) */
+        map.put(28, 12000); /* $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall( name=$0, params=$2 ) */
+        map.put(61, 13000); /* $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) */
+        map.put(62, 14000); /* $e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 ) */
         infix_binding_power_e = Collections.unmodifiableMap(map);
     }
     static {
         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
-        map.put(60, 10000); /* $e = :not $e -> LogicalNot( expression=$1 ) */
-        map.put(9, 10000); /* $e = :plus $e -> UnaryPlus( expression=$1 ) */
-        map.put(63, 10000); /* $e = :dash $e -> UnaryNegation( expression=$1 ) */
+        map.put(52, 10000); /* $e = :not $e -> LogicalNot( expression=$1 ) */
+        map.put(12, 10000); /* $e = :plus $e -> UnaryPlus( expression=$1 ) */
+        map.put(53, 10000); /* $e = :dash $e -> UnaryNegation( expression=$1 ) */
         prefix_binding_power_e = Collections.unmodifiableMap(map);
     }
     static int get_infix_binding_power_e(int terminal_id) {
@@ -2862,7 +2868,7 @@ public static ParseTree parse_e_internal(ParserContext ctx, int rbp) throws Synt
         return left;
     }
     private static ParseTree nud_e(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(135, "e") );
+        ParseTree tree = new ParseTree( new NonTerminal(133, "e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "e";
         if (current == null) {
@@ -2876,7 +2882,7 @@ else if (rule_first.get(117).contains(terminal_map.get(current.getId()))) {
             tree.setAstTransformation(new AstTransformNodeCreator("LogicalNot", parameters));
             tree.setNudMorphemeCount(2);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_NOT));
-            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(60)));
+            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(52)));
             tree.setPrefix(true);
         }
         else if (rule_first.get(118).contains(terminal_map.get(current.getId()))) {
@@ -2887,7 +2893,7 @@ else if (rule_first.get(118).contains(terminal_map.get(current.getId()))) {
             tree.setAstTransformation(new AstTransformNodeCreator("UnaryPlus", parameters));
             tree.setNudMorphemeCount(2);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_PLUS));
-            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(9)));
+            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(12)));
             tree.setPrefix(true);
         }
         else if (rule_first.get(119).contains(terminal_map.get(current.getId()))) {
@@ -2898,42 +2904,49 @@ else if (rule_first.get(119).contains(terminal_map.get(current.getId()))) {
             tree.setAstTransformation(new AstTransformNodeCreator("UnaryNegation", parameters));
             tree.setNudMorphemeCount(2);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DASH));
-            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(63)));
+            tree.add(parse_e_internal(ctx, get_prefix_binding_power_e(53)));
             tree.setPrefix(true);
         }
         else if (rule_first.get(121).contains(terminal_map.get(current.getId()))) {
-            /* (121) $e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 ) */
+            /* (121) $e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 ) */
             ctx.rule = rules.get(121);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
         }
-        else if (rule_first.get(125).contains(terminal_map.get(current.getId()))) {
-            /* (125) $e = :object :lbrace $_gen25 :rbrace -> ObjectLiteral( map=$2 ) */
-            ctx.rule = rules.get(125);
+        else if (rule_first.get(123).contains(terminal_map.get(current.getId()))) {
+            /* (123) $e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 ) */
+            ctx.rule = rules.get(123);
+            tree.setAstTransformation(new AstTransformSubstitution(0));
+            tree.setNudMorphemeCount(1);
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
+        }
+        else if (rule_first.get(126).contains(terminal_map.get(current.getId()))) {
+            /* (126) $e = :object :lbrace $_gen24 :rbrace -> ObjectLiteral( map=$2 ) */
+            ctx.rule = rules.get(126);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("map", 2);
             tree.setAstTransformation(new AstTransformNodeCreator("ObjectLiteral", parameters));
             tree.setNudMorphemeCount(4);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_OBJECT));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LBRACE));
-            tree.add(parse__gen25(ctx));
+            tree.add(parse__gen24(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RBRACE));
         }
-        else if (rule_first.get(126).contains(terminal_map.get(current.getId()))) {
-            /* (126) $e = :lsquare $_gen24 :rsquare -> ArrayLiteral( values=$1 ) */
-            ctx.rule = rules.get(126);
+        else if (rule_first.get(127).contains(terminal_map.get(current.getId()))) {
+            /* (127) $e = :lsquare $_gen25 :rsquare -> ArrayLiteral( values=$1 ) */
+            ctx.rule = rules.get(127);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("values", 1);
             tree.setAstTransformation(new AstTransformNodeCreator("ArrayLiteral", parameters));
             tree.setNudMorphemeCount(3);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LSQUARE));
-            tree.add(parse__gen24(ctx));
+            tree.add(parse__gen25(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RSQUARE));
         }
-        else if (rule_first.get(128).contains(terminal_map.get(current.getId()))) {
-            /* (128) $e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 ) */
-            ctx.rule = rules.get(128);
+        else if (rule_first.get(129).contains(terminal_map.get(current.getId()))) {
+            /* (129) $e = :lbrace $_gen26 :rbrace -> MapLiteral( map=$1 ) */
+            ctx.rule = rules.get(129);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("map", 1);
             tree.setAstTransformation(new AstTransformNodeCreator("MapLiteral", parameters));
@@ -2942,20 +2955,20 @@ else if (rule_first.get(128).contains(terminal_map.get(current.getId()))) {
             tree.add(parse__gen26(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RBRACE));
         }
-        else if (rule_first.get(129).contains(terminal_map.get(current.getId()))) {
-            /* (129) $e = :lparen $_gen24 :rparen -> TupleLiteral( values=$1 ) */
-            ctx.rule = rules.get(129);
+        else if (rule_first.get(130).contains(terminal_map.get(current.getId()))) {
+            /* (130) $e = :lparen $_gen25 :rparen -> TupleLiteral( values=$1 ) */
+            ctx.rule = rules.get(130);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("values", 1);
             tree.setAstTransformation(new AstTransformNodeCreator("TupleLiteral", parameters));
             tree.setNudMorphemeCount(3);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LPAREN));
-            tree.add(parse__gen24(ctx));
+            tree.add(parse__gen25(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RPAREN));
         }
-        else if (rule_first.get(130).contains(terminal_map.get(current.getId()))) {
-            /* (130) $e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 ) */
-            ctx.rule = rules.get(130);
+        else if (rule_first.get(131).contains(terminal_map.get(current.getId()))) {
+            /* (131) $e = :if $e :then $e :else $e -> TernaryIf( cond=$1, iftrue=$3, iffalse=$5 ) */
+            ctx.rule = rules.get(131);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("cond", 1);
             parameters.put("iftrue", 3);
@@ -2969,56 +2982,56 @@ else if (rule_first.get(130).contains(terminal_map.get(current.getId()))) {
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_ELSE));
             tree.add(parse_e(ctx));
         }
-        else if (rule_first.get(131).contains(terminal_map.get(current.getId()))) {
-            /* (131) $e = $string_literal */
-            ctx.rule = rules.get(131);
-            tree.setAstTransformation(new AstTransformSubstitution(0));
-            tree.setNudMorphemeCount(1);
-            tree.add(parse_string_literal(ctx));
-        }
         else if (rule_first.get(132).contains(terminal_map.get(current.getId()))) {
-            /* (132) $e = :identifier */
+            /* (132) $e = $string_literal */
             ctx.rule = rules.get(132);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
+            tree.add(parse_string_literal(ctx));
         }
         else if (rule_first.get(133).contains(terminal_map.get(current.getId()))) {
-            /* (133) $e = :boolean */
+            /* (133) $e = :identifier */
             ctx.rule = rules.get(133);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_BOOLEAN));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_IDENTIFIER));
         }
         else if (rule_first.get(134).contains(terminal_map.get(current.getId()))) {
-            /* (134) $e = :integer */
+            /* (134) $e = :boolean */
             ctx.rule = rules.get(134);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_INTEGER));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_BOOLEAN));
         }
         else if (rule_first.get(135).contains(terminal_map.get(current.getId()))) {
-            /* (135) $e = :float */
+            /* (135) $e = :integer */
             ctx.rule = rules.get(135);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
-            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_FLOAT));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_INTEGER));
         }
         else if (rule_first.get(136).contains(terminal_map.get(current.getId()))) {
-            /* (136) $e = :none */
+            /* (136) $e = :float */
             ctx.rule = rules.get(136);
             tree.setAstTransformation(new AstTransformSubstitution(0));
             tree.setNudMorphemeCount(1);
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_FLOAT));
+        }
+        else if (rule_first.get(137).contains(terminal_map.get(current.getId()))) {
+            /* (137) $e = :none */
+            ctx.rule = rules.get(137);
+            tree.setAstTransformation(new AstTransformSubstitution(0));
+            tree.setNudMorphemeCount(1);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_NONE));
         }
         return tree;
     }
     private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(135, "e") );
+        ParseTree tree = new ParseTree( new NonTerminal(133, "e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "e";
         int modifier;
-        if (current.getId() == 25) {
+        if (current.getId() == 49) {
             /* $e = $e :double_pipe $e -> LogicalOr( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(104);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3030,10 +3043,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DOUBLE_PIPE));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(25) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(49) - modifier));
             return tree;
         }
-        if (current.getId() == 13) {
+        if (current.getId() == 8) {
             /* $e = $e :double_ampersand $e -> LogicalAnd( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(105);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3045,10 +3058,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DOUBLE_AMPERSAND));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(13) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(8) - modifier));
             return tree;
         }
-        if (current.getId() == 24) {
+        if (current.getId() == 56) {
             /* $e = $e :double_equal $e -> Equals( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(106);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3060,10 +3073,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DOUBLE_EQUAL));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(24) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(56) - modifier));
             return tree;
         }
-        if (current.getId() == 14) {
+        if (current.getId() == 63) {
             /* $e = $e :not_equal $e -> NotEquals( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(107);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3075,10 +3088,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_NOT_EQUAL));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(14) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(63) - modifier));
             return tree;
         }
-        if (current.getId() == 65) {
+        if (current.getId() == 37) {
             /* $e = $e :lt $e -> LessThan( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(108);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3090,10 +3103,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LT));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(65) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(37) - modifier));
             return tree;
         }
-        if (current.getId() == 1) {
+        if (current.getId() == 11) {
             /* $e = $e :lteq $e -> LessThanOrEqual( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(109);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3105,10 +3118,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LTEQ));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(1) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(11) - modifier));
             return tree;
         }
-        if (current.getId() == 4) {
+        if (current.getId() == 2) {
             /* $e = $e :gt $e -> GreaterThan( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(110);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3120,10 +3133,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_GT));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(4) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(2) - modifier));
             return tree;
         }
-        if (current.getId() == 21) {
+        if (current.getId() == 3) {
             /* $e = $e :gteq $e -> GreaterThanOrEqual( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(111);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3135,10 +3148,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_GTEQ));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(21) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(3) - modifier));
             return tree;
         }
-        if (current.getId() == 9) {
+        if (current.getId() == 12) {
             /* $e = $e :plus $e -> Add( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(112);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3150,10 +3163,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_PLUS));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(9) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(12) - modifier));
             return tree;
         }
-        if (current.getId() == 63) {
+        if (current.getId() == 53) {
             /* $e = $e :dash $e -> Subtract( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(113);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3165,10 +3178,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_DASH));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(63) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(53) - modifier));
             return tree;
         }
-        if (current.getId() == 3) {
+        if (current.getId() == 34) {
             /* $e = $e :asterisk $e -> Multiply( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(114);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3180,10 +3193,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_ASTERISK));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(3) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(34) - modifier));
             return tree;
         }
-        if (current.getId() == 29) {
+        if (current.getId() == 20) {
             /* $e = $e :slash $e -> Divide( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(115);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3195,10 +3208,10 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_SLASH));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(29) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(20) - modifier));
             return tree;
         }
-        if (current.getId() == 5) {
+        if (current.getId() == 22) {
             /* $e = $e :percent $e -> Remainder( lhs=$0, rhs=$2 ) */
             ctx.rule = rules.get(116);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3210,25 +3223,38 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_PERCENT));
             modifier = 0;
             tree.setInfix(true);
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(5) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(22) - modifier));
             return tree;
         }
-        if (current.getId() == 12) {
-            /* $e = :identifier <=> :lparen $_gen24 :rparen -> FunctionCall( name=$0, params=$2 ) */
+        if (current.getId() == 50) {
+            /* $e = :identifier <=> :lbrace $_gen24 :rbrace -> StructLiteral( name=$0, map=$2 ) */
             ctx.rule = rules.get(121);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("name", 0);
+            parameters.put("map", 2);
+            tree.setAstTransformation(new AstTransformNodeCreator("StructLiteral", parameters));
+            tree.add(left);
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LBRACE));
+            tree.add(parse__gen24(ctx));
+            tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RBRACE));
+            return tree;
+        }
+        if (current.getId() == 28) {
+            /* $e = :identifier <=> :lparen $_gen25 :rparen -> FunctionCall( name=$0, params=$2 ) */
+            ctx.rule = rules.get(123);
+            LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
+            parameters.put("name", 0);
             parameters.put("params", 2);
             tree.setAstTransformation(new AstTransformNodeCreator("FunctionCall", parameters));
             tree.add(left);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LPAREN));
-            tree.add(parse__gen24(ctx));
+            tree.add(parse__gen25(ctx));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RPAREN));
             return tree;
         }
-        if (current.getId() == 51) {
+        if (current.getId() == 61) {
             /* $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup( lhs=$0, rhs=$2 ) */
-            ctx.rule = rules.get(122);
+            ctx.rule = rules.get(124);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("lhs", 0);
             parameters.put("rhs", 2);
@@ -3237,13 +3263,13 @@ private static ParseTree led_e(ParseTree left, ParserContext ctx) throws SyntaxE
             tree.add(left);
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_LSQUARE));
             modifier = 0;
-            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(51) - modifier));
+            tree.add(parse_e_internal(ctx, get_infix_binding_power_e(61) - modifier));
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RSQUARE));
             return tree;
         }
         if (current.getId() == 62) {
             /* $e = $e <=> :dot :identifier -> MemberAccess( value=$0, member=$2 ) */
-            ctx.rule = rules.get(123);
+            ctx.rule = rules.get(125);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
             parameters.put("value", 0);
             parameters.put("member", 2);
@@ -3300,7 +3326,7 @@ public static ParseTree parse_meta_value_internal(ParserContext ctx, int rbp) th
         return left;
     }
     private static ParseTree nud_meta_value(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(113, "meta_value") );
+        ParseTree tree = new ParseTree( new NonTerminal(129, "meta_value") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "meta_value";
         if (current == null) {
@@ -3366,7 +3392,7 @@ else if (rule_first.get(97).contains(terminal_map.get(current.getId()))) {
         return tree;
     }
     private static ParseTree led_meta_value(ParseTree left, ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(113, "meta_value") );
+        ParseTree tree = new ParseTree( new NonTerminal(129, "meta_value") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "meta_value";
         int modifier;
@@ -3376,9 +3402,9 @@ private static ParseTree led_meta_value(ParseTree left, ParserContext ctx) throw
     private static Map<Integer, Integer> prefix_binding_power_type_e;
     static {
         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
-        map.put(51, 1000); /* $type_e = :type <=> :lsquare list($type_e, :comma) :rsquare -> Type( name=$0, subtype=$2 ) */
-        map.put(57, 2000); /* $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) */
-        map.put(9, 3000); /* $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) */
+        map.put(61, 1000); /* $type_e = :type <=> :lsquare list($type_e, :comma) :rsquare -> Type( name=$0, subtype=$2 ) */
+        map.put(9, 2000); /* $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) */
+        map.put(12, 3000); /* $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) */
         infix_binding_power_type_e = Collections.unmodifiableMap(map);
     }
     static {
@@ -3419,7 +3445,7 @@ public static ParseTree parse_type_e_internal(ParserContext ctx, int rbp) throws
         return left;
     }
     private static ParseTree nud_type_e(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(101, "type_e") );
+        ParseTree tree = new ParseTree( new NonTerminal(79, "type_e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "type_e";
         if (current == null) {
@@ -3463,11 +3489,11 @@ else if (rule_first.get(103).contains(terminal_map.get(current.getId()))) {
         return tree;
     }
     private static ParseTree led_type_e(ParseTree left, ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree( new NonTerminal(101, "type_e") );
+        ParseTree tree = new ParseTree( new NonTerminal(79, "type_e") );
         Terminal current = ctx.tokens.current();
         ctx.nonterminal = "type_e";
         int modifier;
-        if (current.getId() == 51) {
+        if (current.getId() == 61) {
             /* $type_e = :type <=> :lsquare $_gen23 :rsquare -> Type( name=$0, subtype=$2 ) */
             ctx.rule = rules.get(99);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3480,7 +3506,7 @@ private static ParseTree led_type_e(ParseTree left, ParserContext ctx) throws Sy
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_RSQUARE));
             return tree;
         }
-        if (current.getId() == 57) {
+        if (current.getId() == 9) {
             /* $type_e = :type <=> :qmark -> OptionalType( innerType=$0 ) */
             ctx.rule = rules.get(100);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3490,7 +3516,7 @@ private static ParseTree led_type_e(ParseTree left, ParserContext ctx) throws Sy
             tree.add(expect(ctx, WdlTerminalIdentifier.TERMINAL_QMARK));
             return tree;
         }
-        if (current.getId() == 9) {
+        if (current.getId() == 12) {
             /* $type_e = :type <=> :plus -> NonEmptyType( innerType=$0 ) */
             ctx.rule = rules.get(101);
             LinkedHashMap<String, Integer> parameters = new LinkedHashMap<String, Integer>();
@@ -3507,12 +3533,12 @@ public ParseTree parse__gen0(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen0(ctx);
     }
     private static ParseTree parse__gen0(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(96, "_gen0"));
+        ParseTree tree = new ParseTree(new NonTerminal(81, "_gen0"));
         tree.setList(true);
         ctx.nonterminal = "_gen0";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(96).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(96).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(81).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(81).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3521,7 +3547,7 @@ private static ParseTree parse__gen0(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(96).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(81).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_import(ctx));
             ctx.nonterminal = "_gen0"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3533,12 +3559,12 @@ public ParseTree parse__gen1(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen1(ctx);
     }
     private static ParseTree parse__gen1(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(98, "_gen1"));
+        ParseTree tree = new ParseTree(new NonTerminal(77, "_gen1"));
         tree.setList(true);
         ctx.nonterminal = "_gen1";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(98).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(98).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(77).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(77).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3547,7 +3573,7 @@ private static ParseTree parse__gen1(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(98).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(77).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_file_body_element(ctx));
             ctx.nonterminal = "_gen1"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3559,12 +3585,12 @@ public ParseTree parse__gen10(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen10(ctx);
     }
     private static ParseTree parse__gen10(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(121, "_gen10"));
+        ParseTree tree = new ParseTree(new NonTerminal(124, "_gen10"));
         tree.setList(true);
         ctx.nonterminal = "_gen10";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(121).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(121).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(124).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(124).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3573,7 +3599,7 @@ private static ParseTree parse__gen10(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(121).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(124).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_input_declaration(ctx));
             ctx.nonterminal = "_gen10"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3585,12 +3611,12 @@ public ParseTree parse__gen11(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen11(ctx);
     }
     private static ParseTree parse__gen11(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(74, "_gen11"));
+        ParseTree tree = new ParseTree(new NonTerminal(97, "_gen11"));
         tree.setList(true);
         ctx.nonterminal = "_gen11";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(74).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(74).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(97).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(97).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3599,7 +3625,7 @@ private static ParseTree parse__gen11(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(74).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(97).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_kv(ctx));
             ctx.nonterminal = "_gen11"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3611,12 +3637,12 @@ public ParseTree parse__gen12(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen12(ctx);
     }
     private static ParseTree parse__gen12(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(110, "_gen12"));
+        ParseTree tree = new ParseTree(new NonTerminal(106, "_gen12"));
         tree.setList(true);
         ctx.nonterminal = "_gen12";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(110).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(110).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(106).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(106).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3625,7 +3651,7 @@ private static ParseTree parse__gen12(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(110).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(106).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_meta_kv(ctx));
             ctx.nonterminal = "_gen12"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3637,12 +3663,12 @@ public ParseTree parse__gen14(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen14(ctx);
     }
     private static ParseTree parse__gen14(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(67, "_gen14"));
+        ParseTree tree = new ParseTree(new NonTerminal(119, "_gen14"));
         tree.setList(true);
         ctx.nonterminal = "_gen14";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(67).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(67).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(119).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(119).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3651,7 +3677,7 @@ private static ParseTree parse__gen14(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(67).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(119).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_output_kv(ctx));
             ctx.nonterminal = "_gen14"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3663,12 +3689,12 @@ public ParseTree parse__gen15(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen15(ctx);
     }
     private static ParseTree parse__gen15(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(123, "_gen15"));
+        ParseTree tree = new ParseTree(new NonTerminal(98, "_gen15"));
         tree.setList(true);
         ctx.nonterminal = "_gen15";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(123).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(123).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(98).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(98).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3677,7 +3703,7 @@ private static ParseTree parse__gen15(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(123).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(98).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_wf_body_element(ctx));
             ctx.nonterminal = "_gen15"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3689,12 +3715,12 @@ public ParseTree parse__gen17(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen17(ctx);
     }
     private static ParseTree parse__gen17(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(132, "_gen17"));
+        ParseTree tree = new ParseTree(new NonTerminal(135, "_gen17"));
         tree.setList(true);
         ctx.nonterminal = "_gen17";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(132).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(132).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(135).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(135).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3703,7 +3729,7 @@ private static ParseTree parse__gen17(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(132).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(135).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_call_after(ctx));
             ctx.nonterminal = "_gen17"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3715,12 +3741,12 @@ public ParseTree parse__gen2(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen2(ctx);
     }
     private static ParseTree parse__gen2(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(140, "_gen2"));
+        ParseTree tree = new ParseTree(new NonTerminal(131, "_gen2"));
         tree.setList(true);
         ctx.nonterminal = "_gen2";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(140).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(140).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(131).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(131).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3729,7 +3755,7 @@ private static ParseTree parse__gen2(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(140).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(131).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_struct_declaration(ctx));
             ctx.nonterminal = "_gen2"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -3741,13 +3767,13 @@ public ParseTree parse__gen20(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen20(ctx);
     }
     private static ParseTree parse__gen20(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(119, "_gen20"));
+        ParseTree tree = new ParseTree(new NonTerminal(110, "_gen20"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen20";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(119).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(119).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(110).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(110).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3756,7 +3782,7 @@ private static ParseTree parse__gen20(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(119).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(110).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_input_kv(ctx));
             ctx.nonterminal = "_gen20"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3782,13 +3808,13 @@ public ParseTree parse__gen21(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen21(ctx);
     }
     private static ParseTree parse__gen21(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(104, "_gen21"));
+        ParseTree tree = new ParseTree(new NonTerminal(140, "_gen21"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen21";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(104).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(104).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(140).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(140).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3797,7 +3823,7 @@ private static ParseTree parse__gen21(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(104).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(140).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_meta_value(ctx));
             ctx.nonterminal = "_gen21"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3823,13 +3849,13 @@ public ParseTree parse__gen22(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen22(ctx);
     }
     private static ParseTree parse__gen22(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(89, "_gen22"));
+        ParseTree tree = new ParseTree(new NonTerminal(102, "_gen22"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen22";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(89).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(89).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(102).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(102).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3838,7 +3864,7 @@ private static ParseTree parse__gen22(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(89).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(102).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_meta_kv(ctx));
             ctx.nonterminal = "_gen22"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3864,13 +3890,13 @@ public ParseTree parse__gen23(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen23(ctx);
     }
     private static ParseTree parse__gen23(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(129, "_gen23"));
+        ParseTree tree = new ParseTree(new NonTerminal(85, "_gen23"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen23";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(129).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(129).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(85).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(85).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3879,7 +3905,7 @@ private static ParseTree parse__gen23(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(129).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(85).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_type_e(ctx));
             ctx.nonterminal = "_gen23"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -3905,13 +3931,13 @@ public ParseTree parse__gen24(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen24(ctx);
     }
     private static ParseTree parse__gen24(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(127, "_gen24"));
+        ParseTree tree = new ParseTree(new NonTerminal(90, "_gen24"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen24";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(127).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(127).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(90).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(90).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3920,8 +3946,8 @@ private static ParseTree parse__gen24(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(127).contains(terminal_map.get(ctx.tokens.current().getId())))) {
-            tree.add(parse_e(ctx));
+               nonterminal_first.get(90).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+            tree.add(parse_object_kv(ctx));
             ctx.nonterminal = "_gen24"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
                 ctx.tokens.current().getId() == WdlTerminalIdentifier.TERMINAL_COMMA.id()) {
@@ -3946,13 +3972,13 @@ public ParseTree parse__gen25(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen25(ctx);
     }
     private static ParseTree parse__gen25(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(80, "_gen25"));
+        ParseTree tree = new ParseTree(new NonTerminal(109, "_gen25"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen25";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(80).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(80).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -3961,8 +3987,8 @@ private static ParseTree parse__gen25(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(80).contains(terminal_map.get(ctx.tokens.current().getId())))) {
-            tree.add(parse_object_kv(ctx));
+               nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+            tree.add(parse_e(ctx));
             ctx.nonterminal = "_gen25"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
                 ctx.tokens.current().getId() == WdlTerminalIdentifier.TERMINAL_COMMA.id()) {
@@ -3987,13 +4013,13 @@ public ParseTree parse__gen26(List<Terminal> tokens, SyntaxErrorFormatter error_
         return parse__gen26(ctx);
     }
     private static ParseTree parse__gen26(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(92, "_gen26"));
+        ParseTree tree = new ParseTree(new NonTerminal(118, "_gen26"));
         tree.setList(true);
-        tree.setListSeparator(38);
+        tree.setListSeparator(4);
         ctx.nonterminal = "_gen26";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(92).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(92).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(118).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(118).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4002,7 +4028,7 @@ private static ParseTree parse__gen26(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(92).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(118).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_map_kv(ctx));
             ctx.nonterminal = "_gen26"; // because parse_* can reset this
             if (ctx.tokens.current() != null &&
@@ -4028,12 +4054,12 @@ public ParseTree parse__gen3(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen3(ctx);
     }
     private static ParseTree parse__gen3(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(109, "_gen3"));
+        ParseTree tree = new ParseTree(new NonTerminal(74, "_gen3"));
         tree.setList(true);
         ctx.nonterminal = "_gen3";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(109).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(74).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(74).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4042,7 +4068,7 @@ private static ParseTree parse__gen3(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(109).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(74).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_static_string_piece(ctx));
             ctx.nonterminal = "_gen3"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4054,12 +4080,12 @@ public ParseTree parse__gen4(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen4(ctx);
     }
     private static ParseTree parse__gen4(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(141, "_gen4"));
+        ParseTree tree = new ParseTree(new NonTerminal(112, "_gen4"));
         tree.setList(true);
         ctx.nonterminal = "_gen4";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(141).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(141).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(112).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(112).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4068,7 +4094,7 @@ private static ParseTree parse__gen4(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(141).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(112).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_string_piece(ctx));
             ctx.nonterminal = "_gen4"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4080,12 +4106,12 @@ public ParseTree parse__gen6(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen6(ctx);
     }
     private static ParseTree parse__gen6(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(124, "_gen6"));
+        ParseTree tree = new ParseTree(new NonTerminal(82, "_gen6"));
         tree.setList(true);
         ctx.nonterminal = "_gen6";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(124).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(124).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(82).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(82).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4094,7 +4120,7 @@ private static ParseTree parse__gen6(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(124).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(82).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_import_alias(ctx));
             ctx.nonterminal = "_gen6"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4106,12 +4132,12 @@ public ParseTree parse__gen7(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen7(ctx);
     }
     private static ParseTree parse__gen7(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(120, "_gen7"));
+        ParseTree tree = new ParseTree(new NonTerminal(87, "_gen7"));
         tree.setList(true);
         ctx.nonterminal = "_gen7";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(120).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(120).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(87).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(87).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4120,7 +4146,7 @@ private static ParseTree parse__gen7(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(120).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(87).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_task_sections(ctx));
             ctx.nonterminal = "_gen7"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4132,12 +4158,12 @@ public ParseTree parse__gen8(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen8(ctx);
     }
     private static ParseTree parse__gen8(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(100, "_gen8"));
+        ParseTree tree = new ParseTree(new NonTerminal(83, "_gen8"));
         tree.setList(true);
         ctx.nonterminal = "_gen8";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(100).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(100).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(83).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(83).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4146,7 +4172,7 @@ private static ParseTree parse__gen8(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(100).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(83).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_command_part(ctx));
             ctx.nonterminal = "_gen8"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4158,12 +4184,12 @@ public ParseTree parse__gen9(List<Terminal> tokens, SyntaxErrorFormatter error_f
         return parse__gen9(ctx);
     }
     private static ParseTree parse__gen9(ParserContext ctx) throws SyntaxError {
-        ParseTree tree = new ParseTree(new NonTerminal(73, "_gen9"));
+        ParseTree tree = new ParseTree(new NonTerminal(75, "_gen9"));
         tree.setList(true);
         ctx.nonterminal = "_gen9";
         if ( ctx.tokens.current() != null &&
-             !nonterminal_first.get(73).contains(terminal_map.get(ctx.tokens.current().getId())) &&
-              nonterminal_follow.get(73).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
+             !nonterminal_first.get(75).contains(terminal_map.get(ctx.tokens.current().getId())) &&
+              nonterminal_follow.get(75).contains(terminal_map.get(ctx.tokens.current().getId())) ) {
             return tree;
         }
         if (ctx.tokens.current() == null) {
@@ -4172,7 +4198,7 @@ private static ParseTree parse__gen9(ParserContext ctx) throws SyntaxError {
         int minimum = 0;
         while (minimum > 0 ||
                (ctx.tokens.current() != null &&
-               nonterminal_first.get(73).contains(terminal_map.get(ctx.tokens.current().getId())))) {
+               nonterminal_first.get(75).contains(terminal_map.get(ctx.tokens.current().getId())))) {
             tree.add(parse_expression_placeholder_kv(ctx));
             ctx.nonterminal = "_gen9"; // because parse_* can reset this
             minimum = Math.max(minimum - 1, 0);
@@ -4187,12 +4213,12 @@ private static ParseTree parse__gen13(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[3][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(70, "_gen13"));
+        int rule = (current != null) ? table[34][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(101, "_gen13"));
         ctx.nonterminal = "_gen13";
         if ( current != null &&
-             !nonterminal_first.get(70).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(70).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(101).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(101).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4216,12 +4242,12 @@ private static ParseTree parse__gen16(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[14][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(81, "_gen16"));
+        int rule = (current != null) ? table[28][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(95, "_gen16"));
         ctx.nonterminal = "_gen16";
         if ( current != null &&
-             !nonterminal_first.get(81).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(81).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(95).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(95).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4245,12 +4271,12 @@ private static ParseTree parse__gen18(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[11][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(78, "_gen18"));
+        int rule = (current != null) ? table[33][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(100, "_gen18"));
         ctx.nonterminal = "_gen18";
         if ( current != null &&
-             !nonterminal_first.get(78).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(78).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(100).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(100).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4274,12 +4300,12 @@ private static ParseTree parse__gen19(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[50][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(117, "_gen19"));
+        int rule = (current != null) ? table[40][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(107, "_gen19"));
         ctx.nonterminal = "_gen19";
         if ( current != null &&
-             !nonterminal_first.get(117).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(117).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(107).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(107).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4303,12 +4329,12 @@ private static ParseTree parse__gen5(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[55][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(122, "_gen5"));
+        int rule = (current != null) ? table[59][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(126, "_gen5"));
         ctx.nonterminal = "_gen5";
         if ( current != null &&
-             !nonterminal_first.get(122).contains(terminal_map.get(current.getId())) &&
-              nonterminal_follow.get(122).contains(terminal_map.get(current.getId())) ) {
+             !nonterminal_first.get(126).contains(terminal_map.get(current.getId())) &&
+              nonterminal_follow.get(126).contains(terminal_map.get(current.getId())) ) {
             return tree;
         }
         if (current == null) {
@@ -4332,14 +4358,14 @@ private static ParseTree parse_alias(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[49][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(116, "alias"));
+        int rule = (current != null) ? table[17][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(84, "alias"));
         ctx.nonterminal = "alias";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "alias",
-                nonterminal_first.get(116),
-                nonterminal_rules.get(116)
+                nonterminal_first.get(84),
+                nonterminal_rules.get(84)
             ));
         }
         if (rule == 81) {
@@ -4355,7 +4381,7 @@ private static ParseTree parse_alias(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "alias",
             current,
-            nonterminal_first.get(116),
+            nonterminal_first.get(84),
             rules.get(81)
         ));
     }
@@ -4367,14 +4393,14 @@ private static ParseTree parse_call(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[8][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(75, "call"));
+        int rule = (current != null) ? table[37][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(104, "call"));
         ctx.nonterminal = "call";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call",
-                nonterminal_first.get(75),
-                nonterminal_rules.get(75)
+                nonterminal_first.get(104),
+                nonterminal_rules.get(104)
             ));
         }
         if (rule == 75) {
@@ -4401,7 +4427,7 @@ private static ParseTree parse_call(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call",
             current,
-            nonterminal_first.get(75),
+            nonterminal_first.get(104),
             rules.get(75)
         ));
     }
@@ -4413,14 +4439,14 @@ private static ParseTree parse_call_after(ParserContext ctx) throws SyntaxError
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[61][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(128, "call_after"));
+        int rule = (current != null) ? table[63][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(130, "call_after"));
         ctx.nonterminal = "call_after";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call_after",
-                nonterminal_first.get(128),
-                nonterminal_rules.get(128)
+                nonterminal_first.get(130),
+                nonterminal_rules.get(130)
             ));
         }
         if (rule == 82) {
@@ -4436,7 +4462,7 @@ private static ParseTree parse_call_after(ParserContext ctx) throws SyntaxError
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call_after",
             current,
-            nonterminal_first.get(128),
+            nonterminal_first.get(130),
             rules.get(82)
         ));
     }
@@ -4448,14 +4474,14 @@ private static ParseTree parse_call_body(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[69][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(136, "call_body"));
+        int rule = (current != null) ? table[71][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(138, "call_body"));
         ctx.nonterminal = "call_body";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call_body",
-                nonterminal_first.get(136),
-                nonterminal_rules.get(136)
+                nonterminal_first.get(138),
+                nonterminal_rules.get(138)
             ));
         }
         if (rule == 80) {
@@ -4475,7 +4501,7 @@ private static ParseTree parse_call_body(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call_body",
             current,
-            nonterminal_first.get(136),
+            nonterminal_first.get(138),
             rules.get(80)
         ));
     }
@@ -4487,14 +4513,14 @@ private static ParseTree parse_call_brace_block(ParserContext ctx) throws Syntax
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[38][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(105, "call_brace_block"));
+        int rule = (current != null) ? table[4][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(71, "call_brace_block"));
         ctx.nonterminal = "call_brace_block";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "call_brace_block",
-                nonterminal_first.get(105),
-                nonterminal_rules.get(105)
+                nonterminal_first.get(71),
+                nonterminal_rules.get(71)
             ));
         }
         if (rule == 78) {
@@ -4512,7 +4538,7 @@ private static ParseTree parse_call_brace_block(ParserContext ctx) throws Syntax
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "call_brace_block",
             current,
-            nonterminal_first.get(105),
+            nonterminal_first.get(71),
             rules.get(78)
         ));
     }
@@ -4524,14 +4550,14 @@ private static ParseTree parse_command(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[28][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(95, "command"));
+        int rule = (current != null) ? table[46][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(113, "command"));
         ctx.nonterminal = "command";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "command",
-                nonterminal_first.get(95),
-                nonterminal_rules.get(95)
+                nonterminal_first.get(113),
+                nonterminal_rules.get(113)
             ));
         }
         if (rule == 34) {
@@ -4553,7 +4579,7 @@ private static ParseTree parse_command(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "command",
             current,
-            nonterminal_first.get(95),
+            nonterminal_first.get(113),
             rules.get(34)
         ));
     }
@@ -4565,14 +4591,14 @@ private static ParseTree parse_command_part(ParserContext ctx) throws SyntaxErro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[21][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(88, "command_part"));
+        int rule = (current != null) ? table[24][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(91, "command_part"));
         ctx.nonterminal = "command_part";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "command_part",
-                nonterminal_first.get(88),
-                nonterminal_rules.get(88)
+                nonterminal_first.get(91),
+                nonterminal_rules.get(91)
             ));
         }
         if (rule == 35) {
@@ -4594,7 +4620,7 @@ else if (rule == 36) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "command_part",
             current,
-            nonterminal_first.get(88),
+            nonterminal_first.get(91),
             rules.get(36)
         ));
     }
@@ -4606,14 +4632,14 @@ private static ParseTree parse_declaration(ParserContext ctx) throws SyntaxError
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[72][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(139, "declaration"));
+        int rule = (current != null) ? table[26][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(93, "declaration"));
         ctx.nonterminal = "declaration";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "declaration",
-                nonterminal_first.get(139),
-                nonterminal_rules.get(139)
+                nonterminal_first.get(93),
+                nonterminal_rules.get(93)
             ));
         }
         if (rule == 54) {
@@ -4635,7 +4661,7 @@ private static ParseTree parse_declaration(ParserContext ctx) throws SyntaxError
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "declaration",
             current,
-            nonterminal_first.get(139),
+            nonterminal_first.get(93),
             rules.get(54)
         ));
     }
@@ -4647,14 +4673,14 @@ private static ParseTree parse_document(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[63][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(130, "document"));
+        int rule = (current != null) ? table[74][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(141, "document"));
         ctx.nonterminal = "document";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "document",
-                nonterminal_first.get(130),
-                nonterminal_rules.get(130)
+                nonterminal_first.get(141),
+                nonterminal_rules.get(141)
             ));
         }
         if (rule == 2) {
@@ -4676,7 +4702,7 @@ private static ParseTree parse_document(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "document",
             current,
-            nonterminal_first.get(130),
+            nonterminal_first.get(141),
             rules.get(2)
         ));
     }
@@ -4688,14 +4714,14 @@ private static ParseTree parse_expression_placeholder(ParserContext ctx) throws
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[66][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(133, "expression_placeholder"));
+        int rule = (current != null) ? table[32][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(99, "expression_placeholder"));
         ctx.nonterminal = "expression_placeholder";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "expression_placeholder",
-                nonterminal_first.get(133),
-                nonterminal_rules.get(133)
+                nonterminal_first.get(99),
+                nonterminal_rules.get(99)
             ));
         }
         if (rule == 38) {
@@ -4718,7 +4744,7 @@ private static ParseTree parse_expression_placeholder(ParserContext ctx) throws
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "expression_placeholder",
             current,
-            nonterminal_first.get(133),
+            nonterminal_first.get(99),
             rules.get(38)
         ));
     }
@@ -4730,14 +4756,14 @@ private static ParseTree parse_expression_placeholder_kv(ParserContext ctx) thro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[20][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(87, "expression_placeholder_kv"));
+        int rule = (current != null) ? table[25][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(92, "expression_placeholder_kv"));
         ctx.nonterminal = "expression_placeholder_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "expression_placeholder_kv",
-                nonterminal_first.get(87),
-                nonterminal_rules.get(87)
+                nonterminal_first.get(92),
+                nonterminal_rules.get(92)
             ));
         }
         if (rule == 39) {
@@ -4760,7 +4786,7 @@ private static ParseTree parse_expression_placeholder_kv(ParserContext ctx) thro
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "expression_placeholder_kv",
             current,
-            nonterminal_first.get(87),
+            nonterminal_first.get(92),
             rules.get(39)
         ));
     }
@@ -4772,14 +4798,14 @@ private static ParseTree parse_file_body_element(ParserContext ctx) throws Synta
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[67][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(134, "file_body_element"));
+        int rule = (current != null) ? table[27][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(94, "file_body_element"));
         ctx.nonterminal = "file_body_element";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "file_body_element",
-                nonterminal_first.get(134),
-                nonterminal_rules.get(134)
+                nonterminal_first.get(94),
+                nonterminal_rules.get(94)
             ));
         }
         if (rule == 3) {
@@ -4809,7 +4835,7 @@ else if (rule == 5) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "file_body_element",
             current,
-            nonterminal_first.get(134),
+            nonterminal_first.get(94),
             rules.get(5)
         ));
     }
@@ -4821,14 +4847,14 @@ private static ParseTree parse_if_stmt(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[2][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(69, "if_stmt"));
+        int rule = (current != null) ? table[36][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(103, "if_stmt"));
         ctx.nonterminal = "if_stmt";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "if_stmt",
-                nonterminal_first.get(69),
-                nonterminal_rules.get(69)
+                nonterminal_first.get(103),
+                nonterminal_rules.get(103)
             ));
         }
         if (rule == 85) {
@@ -4857,7 +4883,7 @@ private static ParseTree parse_if_stmt(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "if_stmt",
             current,
-            nonterminal_first.get(69),
+            nonterminal_first.get(103),
             rules.get(85)
         ));
     }
@@ -4869,14 +4895,14 @@ private static ParseTree parse_import(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[19][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(86, "import"));
+        int rule = (current != null) ? table[38][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(105, "import"));
         ctx.nonterminal = "import";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "import",
-                nonterminal_first.get(86),
-                nonterminal_rules.get(86)
+                nonterminal_first.get(105),
+                nonterminal_rules.get(105)
             ));
         }
         if (rule == 21) {
@@ -4900,7 +4926,7 @@ private static ParseTree parse_import(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "import",
             current,
-            nonterminal_first.get(86),
+            nonterminal_first.get(105),
             rules.get(21)
         ));
     }
@@ -4912,14 +4938,14 @@ private static ParseTree parse_import_alias(ParserContext ctx) throws SyntaxErro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[15][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(82, "import_alias"));
+        int rule = (current != null) ? table[50][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(117, "import_alias"));
         ctx.nonterminal = "import_alias";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "import_alias",
-                nonterminal_first.get(82),
-                nonterminal_rules.get(82)
+                nonterminal_first.get(117),
+                nonterminal_rules.get(117)
             ));
         }
         if (rule == 23) {
@@ -4942,7 +4968,7 @@ private static ParseTree parse_import_alias(ParserContext ctx) throws SyntaxErro
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "import_alias",
             current,
-            nonterminal_first.get(82),
+            nonterminal_first.get(117),
             rules.get(23)
         ));
     }
@@ -4954,14 +4980,14 @@ private static ParseTree parse_import_namespace(ParserContext ctx) throws Syntax
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[24][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(91, "import_namespace"));
+        int rule = (current != null) ? table[21][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(88, "import_namespace"));
         ctx.nonterminal = "import_namespace";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "import_namespace",
-                nonterminal_first.get(91),
-                nonterminal_rules.get(91)
+                nonterminal_first.get(88),
+                nonterminal_rules.get(88)
             ));
         }
         if (rule == 22) {
@@ -4977,7 +5003,7 @@ private static ParseTree parse_import_namespace(ParserContext ctx) throws Syntax
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "import_namespace",
             current,
-            nonterminal_first.get(91),
+            nonterminal_first.get(88),
             rules.get(22)
         ));
     }
@@ -4989,14 +5015,14 @@ private static ParseTree parse_input_declaration(ParserContext ctx) throws Synta
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[58][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(125, "input_declaration"));
+        int rule = (current != null) ? table[56][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(123, "input_declaration"));
         ctx.nonterminal = "input_declaration";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "input_declaration",
-                nonterminal_first.get(125),
-                nonterminal_rules.get(125)
+                nonterminal_first.get(123),
+                nonterminal_rules.get(123)
             ));
         }
         if (rule == 53) {
@@ -5018,7 +5044,7 @@ private static ParseTree parse_input_declaration(ParserContext ctx) throws Synta
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "input_declaration",
             current,
-            nonterminal_first.get(125),
+            nonterminal_first.get(123),
             rules.get(53)
         ));
     }
@@ -5030,14 +5056,14 @@ private static ParseTree parse_input_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[9][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(76, "input_kv"));
+        int rule = (current != null) ? table[5][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(72, "input_kv"));
         ctx.nonterminal = "input_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "input_kv",
-                nonterminal_first.get(76),
-                nonterminal_rules.get(76)
+                nonterminal_first.get(72),
+                nonterminal_rules.get(72)
             ));
         }
         if (rule == 88) {
@@ -5058,7 +5084,7 @@ private static ParseTree parse_input_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "input_kv",
             current,
-            nonterminal_first.get(76),
+            nonterminal_first.get(72),
             rules.get(88)
         ));
     }
@@ -5070,14 +5096,14 @@ private static ParseTree parse_inputs(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[16][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(83, "inputs"));
+        int rule = (current != null) ? table[22][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(89, "inputs"));
         ctx.nonterminal = "inputs";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "inputs",
-                nonterminal_first.get(83),
-                nonterminal_rules.get(83)
+                nonterminal_first.get(89),
+                nonterminal_rules.get(89)
             ));
         }
         if (rule == 41) {
@@ -5099,7 +5125,7 @@ private static ParseTree parse_inputs(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "inputs",
             current,
-            nonterminal_first.get(83),
+            nonterminal_first.get(89),
             rules.get(41)
         ));
     }
@@ -5111,14 +5137,14 @@ private static ParseTree parse_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[12][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(79, "kv"));
+        int rule = (current != null) ? table[70][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(137, "kv"));
         ctx.nonterminal = "kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "kv",
-                nonterminal_first.get(79),
-                nonterminal_rules.get(79)
+                nonterminal_first.get(137),
+                nonterminal_rules.get(137)
             ));
         }
         if (rule == 45) {
@@ -5139,7 +5165,7 @@ private static ParseTree parse_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "kv",
             current,
-            nonterminal_first.get(79),
+            nonterminal_first.get(137),
             rules.get(45)
         ));
     }
@@ -5151,14 +5177,14 @@ private static ParseTree parse_map_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[18][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(85, "map_kv"));
+        int rule = (current != null) ? table[72][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(139, "map_kv"));
         ctx.nonterminal = "map_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "map_kv",
-                nonterminal_first.get(85),
-                nonterminal_rules.get(85)
+                nonterminal_first.get(139),
+                nonterminal_rules.get(139)
             ));
         }
         if (rule == 56) {
@@ -5179,7 +5205,7 @@ private static ParseTree parse_map_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "map_kv",
             current,
-            nonterminal_first.get(85),
+            nonterminal_first.get(139),
             rules.get(56)
         ));
     }
@@ -5191,14 +5217,14 @@ private static ParseTree parse_meta(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[59][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(126, "meta"));
+        int rule = (current != null) ? table[65][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(132, "meta"));
         ctx.nonterminal = "meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "meta",
-                nonterminal_first.get(126),
-                nonterminal_rules.get(126)
+                nonterminal_first.get(132),
+                nonterminal_rules.get(132)
             ));
         }
         if (rule == 46) {
@@ -5216,7 +5242,7 @@ private static ParseTree parse_meta(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "meta",
             current,
-            nonterminal_first.get(126),
+            nonterminal_first.get(132),
             rules.get(46)
         ));
     }
@@ -5228,14 +5254,14 @@ private static ParseTree parse_meta_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[10][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(77, "meta_kv"));
+        int rule = (current != null) ? table[6][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(73, "meta_kv"));
         ctx.nonterminal = "meta_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "meta_kv",
-                nonterminal_first.get(77),
-                nonterminal_rules.get(77)
+                nonterminal_first.get(73),
+                nonterminal_rules.get(73)
             ));
         }
         if (rule == 50) {
@@ -5256,7 +5282,7 @@ private static ParseTree parse_meta_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "meta_kv",
             current,
-            nonterminal_first.get(77),
+            nonterminal_first.get(73),
             rules.get(50)
         ));
     }
@@ -5268,14 +5294,14 @@ private static ParseTree parse_meta_map(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[48][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(115, "meta_map"));
+        int rule = (current != null) ? table[41][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(108, "meta_map"));
         ctx.nonterminal = "meta_map";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "meta_map",
-                nonterminal_first.get(115),
-                nonterminal_rules.get(115)
+                nonterminal_first.get(108),
+                nonterminal_rules.get(108)
             ));
         }
         if (rule == 49) {
@@ -5293,7 +5319,7 @@ private static ParseTree parse_meta_map(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "meta_map",
             current,
-            nonterminal_first.get(115),
+            nonterminal_first.get(108),
             rules.get(49)
         ));
     }
@@ -5305,14 +5331,14 @@ private static ParseTree parse_object_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[47][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(114, "object_kv"));
+        int rule = (current != null) ? table[13][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(80, "object_kv"));
         ctx.nonterminal = "object_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "object_kv",
-                nonterminal_first.get(114),
-                nonterminal_rules.get(114)
+                nonterminal_first.get(80),
+                nonterminal_rules.get(80)
             ));
         }
         if (rule == 87) {
@@ -5333,7 +5359,7 @@ private static ParseTree parse_object_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "object_kv",
             current,
-            nonterminal_first.get(114),
+            nonterminal_first.get(80),
             rules.get(87)
         ));
     }
@@ -5345,14 +5371,14 @@ private static ParseTree parse_output_kv(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[40][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(107, "output_kv"));
+        int rule = (current != null) ? table[58][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(125, "output_kv"));
         ctx.nonterminal = "output_kv";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "output_kv",
-                nonterminal_first.get(107),
-                nonterminal_rules.get(107)
+                nonterminal_first.get(125),
+                nonterminal_rules.get(125)
             ));
         }
         if (rule == 59) {
@@ -5376,7 +5402,7 @@ private static ParseTree parse_output_kv(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "output_kv",
             current,
-            nonterminal_first.get(107),
+            nonterminal_first.get(125),
             rules.get(59)
         ));
     }
@@ -5388,14 +5414,14 @@ private static ParseTree parse_outputs(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[44][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(111, "outputs"));
+        int rule = (current != null) ? table[3][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(70, "outputs"));
         ctx.nonterminal = "outputs";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "outputs",
-                nonterminal_first.get(111),
-                nonterminal_rules.get(111)
+                nonterminal_first.get(70),
+                nonterminal_rules.get(70)
             ));
         }
         if (rule == 58) {
@@ -5417,7 +5443,7 @@ private static ParseTree parse_outputs(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "outputs",
             current,
-            nonterminal_first.get(111),
+            nonterminal_first.get(70),
             rules.get(58)
         ));
     }
@@ -5429,14 +5455,14 @@ private static ParseTree parse_parameter_meta(ParserContext ctx) throws SyntaxEr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[5][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(72, "parameter_meta"));
+        int rule = (current != null) ? table[47][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(114, "parameter_meta"));
         ctx.nonterminal = "parameter_meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "parameter_meta",
-                nonterminal_first.get(72),
-                nonterminal_rules.get(72)
+                nonterminal_first.get(114),
+                nonterminal_rules.get(114)
             ));
         }
         if (rule == 47) {
@@ -5454,7 +5480,7 @@ private static ParseTree parse_parameter_meta(ParserContext ctx) throws SyntaxEr
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "parameter_meta",
             current,
-            nonterminal_first.get(72),
+            nonterminal_first.get(114),
             rules.get(47)
         ));
     }
@@ -5466,14 +5492,14 @@ private static ParseTree parse_rt_map(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[26][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(93, "rt_map"));
+        int rule = (current != null) ? table[0][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(67, "rt_map"));
         ctx.nonterminal = "rt_map";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "rt_map",
-                nonterminal_first.get(93),
-                nonterminal_rules.get(93)
+                nonterminal_first.get(67),
+                nonterminal_rules.get(67)
             ));
         }
         if (rule == 44) {
@@ -5491,7 +5517,7 @@ private static ParseTree parse_rt_map(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "rt_map",
             current,
-            nonterminal_first.get(93),
+            nonterminal_first.get(67),
             rules.get(44)
         ));
     }
@@ -5503,14 +5529,14 @@ private static ParseTree parse_runtime(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[64][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(131, "runtime"));
+        int rule = (current != null) ? table[61][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(128, "runtime"));
         ctx.nonterminal = "runtime";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "runtime",
-                nonterminal_first.get(131),
-                nonterminal_rules.get(131)
+                nonterminal_first.get(128),
+                nonterminal_rules.get(128)
             ));
         }
         if (rule == 42) {
@@ -5528,7 +5554,7 @@ private static ParseTree parse_runtime(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "runtime",
             current,
-            nonterminal_first.get(131),
+            nonterminal_first.get(128),
             rules.get(42)
         ));
     }
@@ -5540,14 +5566,14 @@ private static ParseTree parse_scatter(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[36][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(103, "scatter"));
+        int rule = (current != null) ? table[48][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(115, "scatter"));
         ctx.nonterminal = "scatter";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "scatter",
-                nonterminal_first.get(103),
-                nonterminal_rules.get(103)
+                nonterminal_first.get(115),
+                nonterminal_rules.get(115)
             ));
         }
         if (rule == 86) {
@@ -5581,7 +5607,7 @@ private static ParseTree parse_scatter(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "scatter",
             current,
-            nonterminal_first.get(103),
+            nonterminal_first.get(115),
             rules.get(86)
         ));
     }
@@ -5593,14 +5619,14 @@ private static ParseTree parse_setter(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[32][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(99, "setter"));
+        int rule = (current != null) ? table[69][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(136, "setter"));
         ctx.nonterminal = "setter";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "setter",
-                nonterminal_first.get(99),
-                nonterminal_rules.get(99)
+                nonterminal_first.get(136),
+                nonterminal_rules.get(136)
             ));
         }
         if (rule == 55) {
@@ -5616,7 +5642,7 @@ private static ParseTree parse_setter(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "setter",
             current,
-            nonterminal_first.get(99),
+            nonterminal_first.get(136),
             rules.get(55)
         ));
     }
@@ -5628,14 +5654,14 @@ private static ParseTree parse_static_string(ParserContext ctx) throws SyntaxErr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[39][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(106, "static_string"));
+        int rule = (current != null) ? table[53][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(120, "static_string"));
         ctx.nonterminal = "static_string";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "static_string",
-                nonterminal_first.get(106),
-                nonterminal_rules.get(106)
+                nonterminal_first.get(120),
+                nonterminal_rules.get(120)
             ));
         }
         if (rule == 11) {
@@ -5655,7 +5681,7 @@ private static ParseTree parse_static_string(ParserContext ctx) throws SyntaxErr
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "static_string",
             current,
-            nonterminal_first.get(106),
+            nonterminal_first.get(120),
             rules.get(11)
         ));
     }
@@ -5667,14 +5693,14 @@ private static ParseTree parse_static_string_piece(ParserContext ctx) throws Syn
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[51][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(118, "static_string_piece"));
+        int rule = (current != null) ? table[44][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(111, "static_string_piece"));
         ctx.nonterminal = "static_string_piece";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "static_string_piece",
-                nonterminal_first.get(118),
-                nonterminal_rules.get(118)
+                nonterminal_first.get(111),
+                nonterminal_rules.get(111)
             ));
         }
         if (rule == 14) {
@@ -5696,7 +5722,7 @@ else if (rule == 15) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "static_string_piece",
             current,
-            nonterminal_first.get(118),
+            nonterminal_first.get(111),
             rules.get(15)
         ));
     }
@@ -5708,14 +5734,14 @@ private static ParseTree parse_string_literal(ParserContext ctx) throws SyntaxEr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[30][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(97, "string_literal"));
+        int rule = (current != null) ? table[60][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(127, "string_literal"));
         ctx.nonterminal = "string_literal";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "string_literal",
-                nonterminal_first.get(97),
-                nonterminal_rules.get(97)
+                nonterminal_first.get(127),
+                nonterminal_rules.get(127)
             ));
         }
         if (rule == 13) {
@@ -5735,7 +5761,7 @@ private static ParseTree parse_string_literal(ParserContext ctx) throws SyntaxEr
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "string_literal",
             current,
-            nonterminal_first.get(97),
+            nonterminal_first.get(127),
             rules.get(13)
         ));
     }
@@ -5747,14 +5773,14 @@ private static ParseTree parse_string_piece(ParserContext ctx) throws SyntaxErro
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[35][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(102, "string_piece"));
+        int rule = (current != null) ? table[19][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(86, "string_piece"));
         ctx.nonterminal = "string_piece";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "string_piece",
-                nonterminal_first.get(102),
-                nonterminal_rules.get(102)
+                nonterminal_first.get(86),
+                nonterminal_rules.get(86)
             ));
         }
         if (rule == 16) {
@@ -5776,7 +5802,7 @@ else if (rule == 17) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "string_piece",
             current,
-            nonterminal_first.get(102),
+            nonterminal_first.get(86),
             rules.get(17)
         ));
     }
@@ -5788,14 +5814,14 @@ private static ParseTree parse_struct(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[23][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(90, "struct"));
+        int rule = (current != null) ? table[9][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(76, "struct"));
         ctx.nonterminal = "struct";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "struct",
-                nonterminal_first.get(90),
-                nonterminal_rules.get(90)
+                nonterminal_first.get(76),
+                nonterminal_rules.get(76)
             ));
         }
         if (rule == 8) {
@@ -5820,7 +5846,7 @@ private static ParseTree parse_struct(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "struct",
             current,
-            nonterminal_first.get(90),
+            nonterminal_first.get(76),
             rules.get(8)
         ));
     }
@@ -5832,14 +5858,14 @@ private static ParseTree parse_struct_declaration(ParserContext ctx) throws Synt
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[45][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(112, "struct_declaration"));
+        int rule = (current != null) ? table[11][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(78, "struct_declaration"));
         ctx.nonterminal = "struct_declaration";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "struct_declaration",
-                nonterminal_first.get(112),
-                nonterminal_rules.get(112)
+                nonterminal_first.get(78),
+                nonterminal_rules.get(78)
             ));
         }
         if (rule == 9) {
@@ -5858,7 +5884,7 @@ private static ParseTree parse_struct_declaration(ParserContext ctx) throws Synt
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "struct_declaration",
             current,
-            nonterminal_first.get(112),
+            nonterminal_first.get(78),
             rules.get(9)
         ));
     }
@@ -5870,14 +5896,14 @@ private static ParseTree parse_task(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[1][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(68, "task"));
+        int rule = (current != null) ? table[54][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(121, "task"));
         ctx.nonterminal = "task";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "task",
-                nonterminal_first.get(68),
-                nonterminal_rules.get(68)
+                nonterminal_first.get(121),
+                nonterminal_rules.get(121)
             ));
         }
         if (rule == 25) {
@@ -5902,7 +5928,7 @@ private static ParseTree parse_task(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "task",
             current,
-            nonterminal_first.get(68),
+            nonterminal_first.get(121),
             rules.get(25)
         ));
     }
@@ -5914,14 +5940,14 @@ private static ParseTree parse_task_sections(ParserContext ctx) throws SyntaxErr
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[70][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(137, "task_sections"));
+        int rule = (current != null) ? table[55][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(122, "task_sections"));
         ctx.nonterminal = "task_sections";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "task_sections",
-                nonterminal_first.get(137),
-                nonterminal_rules.get(137)
+                nonterminal_first.get(122),
+                nonterminal_rules.get(122)
             ));
         }
         if (rule == 26) {
@@ -5983,7 +6009,7 @@ else if (rule == 32) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "task_sections",
             current,
-            nonterminal_first.get(137),
+            nonterminal_first.get(122),
             rules.get(32)
         ));
     }
@@ -5995,14 +6021,14 @@ private static ParseTree parse_version(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[17][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(84, "version"));
+        int rule = (current != null) ? table[29][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(96, "version"));
         ctx.nonterminal = "version";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "version",
-                nonterminal_first.get(84),
-                nonterminal_rules.get(84)
+                nonterminal_first.get(96),
+                nonterminal_rules.get(96)
             ));
         }
         if (rule == 6) {
@@ -6020,7 +6046,7 @@ private static ParseTree parse_version(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "version",
             current,
-            nonterminal_first.get(84),
+            nonterminal_first.get(96),
             rules.get(6)
         ));
     }
@@ -6032,14 +6058,14 @@ private static ParseTree parse_wf_body_element(ParserContext ctx) throws SyntaxE
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[4][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(71, "wf_body_element"));
+        int rule = (current != null) ? table[49][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(116, "wf_body_element"));
         ctx.nonterminal = "wf_body_element";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "wf_body_element",
-                nonterminal_first.get(71),
-                nonterminal_rules.get(71)
+                nonterminal_first.get(116),
+                nonterminal_rules.get(116)
             ));
         }
         if (rule == 62) {
@@ -6109,7 +6135,7 @@ else if (rule == 69) {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "wf_body_element",
             current,
-            nonterminal_first.get(71),
+            nonterminal_first.get(116),
             rules.get(69)
         ));
     }
@@ -6121,14 +6147,14 @@ private static ParseTree parse_wf_meta(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[71][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(138, "wf_meta"));
+        int rule = (current != null) ? table[1][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(68, "wf_meta"));
         ctx.nonterminal = "wf_meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "wf_meta",
-                nonterminal_first.get(138),
-                nonterminal_rules.get(138)
+                nonterminal_first.get(68),
+                nonterminal_rules.get(68)
             ));
         }
         if (rule == 84) {
@@ -6146,7 +6172,7 @@ private static ParseTree parse_wf_meta(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "wf_meta",
             current,
-            nonterminal_first.get(138),
+            nonterminal_first.get(68),
             rules.get(84)
         ));
     }
@@ -6158,14 +6184,14 @@ private static ParseTree parse_wf_parameter_meta(ParserContext ctx) throws Synta
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[41][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(108, "wf_parameter_meta"));
+        int rule = (current != null) ? table[67][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(134, "wf_parameter_meta"));
         ctx.nonterminal = "wf_parameter_meta";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "wf_parameter_meta",
-                nonterminal_first.get(108),
-                nonterminal_rules.get(108)
+                nonterminal_first.get(134),
+                nonterminal_rules.get(134)
             ));
         }
         if (rule == 83) {
@@ -6183,7 +6209,7 @@ private static ParseTree parse_wf_parameter_meta(ParserContext ctx) throws Synta
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "wf_parameter_meta",
             current,
-            nonterminal_first.get(108),
+            nonterminal_first.get(134),
             rules.get(83)
         ));
     }
@@ -6195,14 +6221,14 @@ private static ParseTree parse_workflow(ParserContext ctx) throws SyntaxError {
         Terminal current = ctx.tokens.current();
         Terminal next;
         ParseTree subtree;
-        int rule = (current != null) ? table[27][current.getId()] : -1;
-        ParseTree tree = new ParseTree(new NonTerminal(94, "workflow"));
+        int rule = (current != null) ? table[2][current.getId()] : -1;
+        ParseTree tree = new ParseTree(new NonTerminal(69, "workflow"));
         ctx.nonterminal = "workflow";
         if (current == null) {
             throw new SyntaxError(ctx.error_formatter.unexpectedEof(
                 "workflow",
-                nonterminal_first.get(94),
-                nonterminal_rules.get(94)
+                nonterminal_first.get(69),
+                nonterminal_rules.get(69)
             ));
         }
         if (rule == 61) {
@@ -6227,7 +6253,7 @@ private static ParseTree parse_workflow(ParserContext ctx) throws SyntaxError {
         throw new SyntaxError(ctx.error_formatter.unexpectedSymbol(
             "workflow",
             current,
-            nonterminal_first.get(94),
+            nonterminal_first.get(69),
             rules.get(61)
         ));
     }
@@ -6357,9 +6383,6 @@ public void output(LexerContext ctx, TerminalIdentifier terminal, String source_
     default_action(ctx, terminal, source_string, line, col);
 }
     /* END USER CODE */
-    public List<Terminal> post_filter(List<Terminal> terminals) {
-        return terminals;
-    }
     public void destroy(Object context) {
         return;
     }
@@ -7867,8 +7890,7 @@ public List<Terminal> lex(String string, String resource) throws SyntaxError {
             }
         }
         this.destroy(context);
-        List<Terminal> filtered = post_filter(lctx.terminals);
-        return filtered;
+        return lctx.terminals;
     }
     /* Section: Main */
 }
diff --git a/wdl/transforms/cascades/src/main/resources/CHANGELOG.txt b/wdl/transforms/cascades/src/main/resources/CHANGELOG.txt
index b407769cba8..bb8a4687868 100644
--- a/wdl/transforms/cascades/src/main/resources/CHANGELOG.txt
+++ b/wdl/transforms/cascades/src/main/resources/CHANGELOG.txt
@@ -2,4 +2,15 @@
 
 Duplicated Cromwell `biscayne` into `cascades` to serve as new home for OpenWDL `development` version. Grammar synced from OpenWDL.
 Will become WDL 1.2 or 2.0.
-Some Terra users run `version development` WDLs, we don't officially support it, but shouldn't break it too badly if possible.
\ No newline at end of file
+Some Terra users run `version development` WDLs, we don't officially support it, but shouldn't break it too badly if possible.
+
+2024-02-28
+When changing the grammar file, generate a new parser by:
+- changing current working directory to cromwell/wdl/transforms/cascades
+- running: hermes generate src/main/resources/grammar.hgr \
+          --language=java \
+          --directory=src/main/java \
+          --name=wdl \
+          --java-package=wdl.cascades.parser \
+          --java-use-apache-commons --java-imports=org.apache.commons.lang3.StringEscapeUtils \
+          --header
diff --git a/wdl/transforms/cascades/src/main/resources/grammar.hgr b/wdl/transforms/cascades/src/main/resources/grammar.hgr
index 0b17648d925..b5b743b2b06 100644
--- a/wdl/transforms/cascades/src/main/resources/grammar.hgr
+++ b/wdl/transforms/cascades/src/main/resources/grammar.hgr
@@ -401,6 +401,7 @@ grammar {
       (*:unary) $e = :not $e -> LogicalNot(expression=$1)
       (-:unary) $e = :plus $e -> UnaryPlus(expression=$1)
       (-:unary) $e = :dash $e -> UnaryNegation(expression=$1)
+      (*:left) $e = :identifier <=> :lbrace list($object_kv, :comma) :rbrace -> StructLiteral(name=$0, map=$2)
       (*:left) $e = :identifier <=> :lparen list($e, :comma) :rparen -> FunctionCall(name=$0, params=$2)
       (*:left) $e = $e <=> :lsquare $e :rsquare -> ArrayOrMapLookup(lhs=$0, rhs=$2)
       (*:left) $e = $e <=> :dot :identifier -> MemberAccess(value=$0, member=$2)
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumers.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumers.scala
index d0faaea154e..1d752645bad 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumers.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumers.scala
@@ -105,4 +105,14 @@ object cascadesExpressionValueConsumers {
     ): Set[UnlinkedConsumedValueHook] =
       expressionValueConsumer.expressionConsumedValueHooks(a.param)(expressionValueConsumer)
   }
+
+  implicit val structLiteralExpressionValueConsumer: ExpressionValueConsumer[StructLiteral] =
+    new ExpressionValueConsumer[StructLiteral] {
+      override def expressionConsumedValueHooks(a: StructLiteral)(implicit
+        expressionValueConsumer: ExpressionValueConsumer[ExpressionElement]
+      ): Set[UnlinkedConsumedValueHook] =
+        a.elements.values
+          .flatMap(element => expressionValueConsumer.expressionConsumedValueHooks(element)(expressionValueConsumer))
+          .toSet
+    }
 }
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/consumed.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/consumed.scala
index 4916a7afd02..18a855e29b8 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/consumed.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/consumed/consumed.scala
@@ -24,6 +24,7 @@ package object consumed {
 
         case a: StringExpression => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: ObjectLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
+        case a: StructLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: PairLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: ArrayLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
         case a: MapLiteral => a.expressionConsumedValueHooks(expressionValueConsumer)
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluators.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluators.scala
index 2ce3d01b0de..220049bfca6 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluators.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluators.scala
@@ -1,5 +1,8 @@
 package wdl.transforms.cascades.linking.expression.files
 
+import cats.implicits.{catsSyntaxValidatedId, toTraverseOps}
+import common.validation.ErrorOr.ErrorOr
+import wdl.model.draft3.elements.ExpressionElement
 import wdl.model.draft3.elements.ExpressionElement.{
   AsMap,
   AsPairs,
@@ -10,16 +13,20 @@ import wdl.model.draft3.elements.ExpressionElement.{
   Quote,
   Sep,
   SQuote,
+  StructLiteral,
   SubPosix,
   Suffix,
   Unzip
 }
-import wdl.model.draft3.graph.expression.FileEvaluator
+import wdl.model.draft3.graph.expression.{FileEvaluator, ValueEvaluator}
 import wdl.transforms.base.linking.expression.files.EngineFunctionEvaluators
 import wdl.transforms.base.linking.expression.files.EngineFunctionEvaluators.{
   threeParameterFunctionPassthroughFileEvaluator,
   twoParameterFunctionPassthroughFileEvaluator
 }
+import wom.expression.IoFunctionSet
+import wom.types.{WomCompositeType, WomType}
+import wom.values.{WomFile, WomValue}
 
 object cascadesFileEvaluators {
 
@@ -45,4 +52,37 @@ object cascadesFileEvaluators {
   implicit val minFunctionEvaluator: FileEvaluator[Min] = twoParameterFunctionPassthroughFileEvaluator[Min]
   implicit val maxFunctionEvaluator: FileEvaluator[Max] = twoParameterFunctionPassthroughFileEvaluator[Max]
 
+  implicit val structLiteralEvaluator: FileEvaluator[StructLiteral] = new FileEvaluator[StructLiteral] {
+    override def predictFilesNeededToEvaluate(a: StructLiteral,
+                                              inputs: Map[String, WomValue],
+                                              ioFunctionSet: IoFunctionSet,
+                                              coerceTo: WomType
+    )(implicit
+      fileEvaluator: FileEvaluator[ExpressionElement],
+      valueEvaluator: ValueEvaluator[ExpressionElement]
+    ): ErrorOr[Set[WomFile]] = {
+      def filesInObjectField(fieldAndWomTypeTuple: (String, WomType)): ErrorOr[Set[WomFile]] = {
+        val (field, womType) = fieldAndWomTypeTuple
+        a.elements.get(field) match {
+          case Some(fieldElement) =>
+            fileEvaluator.predictFilesNeededToEvaluate(fieldElement, inputs, ioFunctionSet, womType)(fileEvaluator,
+                                                                                                     valueEvaluator
+            )
+          case None => s"Invalid assignment to struct. Required field $field was not specified.".invalidNel
+        }
+      }
+
+      coerceTo match {
+        case WomCompositeType(mapping, _) => mapping.toList.traverse(filesInObjectField).map(_.flatten.toSet)
+        case _ =>
+          a.elements.values.toList
+            .traverse(
+              fileEvaluator.evaluateFilesNeededToEvaluate(_, inputs, ioFunctionSet, coerceTo)(fileEvaluator,
+                                                                                              valueEvaluator
+              )
+            )
+            .map(_.toSet.flatten)
+      }
+    }
+  }
 }
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/files.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/files.scala
index f1935603458..c770483e4c7 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/files.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/files/files.scala
@@ -37,6 +37,8 @@ package object files {
           a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
         case a: ObjectLiteral =>
           a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
+        case a: StructLiteral =>
+          a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
         case a: MapLiteral =>
           a.predictFilesNeededToEvaluate(inputs, ioFunctionSet, coerceTo)(fileEvaluator, valueEvaluator)
         case a: ArrayLiteral =>
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluators.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluators.scala
index ba7e9ae8dff..137b42128e2 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluators.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluators.scala
@@ -159,4 +159,16 @@ object cascadesTypeEvaluators {
         case other => s"Cannot invoke 'unzip' on type '${other.stableName}'. Expected an array of pairs".invalidNel
       }
   }
+
+  implicit val structLiteralTypeEvaluator: TypeEvaluator[StructLiteral] = new TypeEvaluator[StructLiteral] {
+    override def evaluateType(a: StructLiteral, linkedValues: Map[UnlinkedConsumedValueHook, GeneratedValueHandle])(
+      implicit expressionTypeEvaluator: TypeEvaluator[ExpressionElement]
+    ): ErrorOr[WomType] =
+      // This works fine, but is not yet a strong enough type check for the WDL 1.1 spec
+      // (i.e. users are able to instantiate struct literals with k/v pairs that aren't actually in the struct definition, without an error being thrown.)
+      // We want to add extra validation here, and return a WomCompositeType that matches the struct definition of everything is OK.
+      // Note that users are allowed to omit optional k/v pairs in their literal.
+      // This requires some extra work to be done in a subsequent PR.
+      WomObjectType.validNel
+  }
 }
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/types.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/types.scala
index 1a027b745ed..58e1fe888d7 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/types.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/types/types.scala
@@ -29,6 +29,7 @@ package object types {
         case a: StringLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: StringExpression => a.evaluateType(linkedValues)(typeEvaluator)
         case a: ObjectLiteral => a.evaluateType(linkedValues)(typeEvaluator)
+        case a: StructLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: MapLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: ArrayLiteral => a.evaluateType(linkedValues)(typeEvaluator)
         case a: PairLiteral => a.evaluateType(linkedValues)(typeEvaluator)
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluators.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluators.scala
index ee106f2ef6a..5df336f062e 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluators.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluators.scala
@@ -18,7 +18,7 @@ import wdl.transforms.base.linking.expression.values.EngineFunctionEvaluators.{
 }
 import wom.expression.IoFunctionSet
 import wom.types._
-import wom.values.{WomArray, WomFloat, WomInteger, WomMap, WomOptionalValue, WomPair, WomString, WomValue}
+import wom.values.{WomArray, WomFloat, WomInteger, WomMap, WomObject, WomOptionalValue, WomPair, WomString, WomValue}
 import wom.types.coercion.defaults._
 
 object cascadesValueEvaluators {
@@ -345,4 +345,29 @@ object cascadesValueEvaluators {
           s"Invalid call of 'unzip' on parameter of type '${other.womType.stableName}' (expected Array[Pair[X, Y]])".invalidNel
       }
   }
+
+  implicit val structLiteralValueEvaluator: ValueEvaluator[StructLiteral] = new ValueEvaluator[StructLiteral] {
+    // This works fine, but is missing a feature from the WDL 1.1 spec: users are allowed to omit optional values from their struct literal.
+    // This requires some extra work to be done in a subsequent PR.
+    // Specifically, make the known struct definitions available to this function so we can populate k/v pairs with None appropriately.
+    override def evaluateValue(a: StructLiteral,
+                               inputs: Map[String, WomValue],
+                               ioFunctionSet: IoFunctionSet,
+                               forCommandInstantiationOptions: Option[ForCommandInstantiationOptions]
+    )(implicit expressionValueEvaluator: ValueEvaluator[ExpressionElement]): ErrorOr[EvaluatedValue[_ <: WomValue]] = {
+
+      val evaluated: ErrorOr[List[(String, EvaluatedValue[_])]] = a.elements.toList traverse {
+        case (key: String, value: ExpressionElement) =>
+          expressionValueEvaluator
+            .evaluateValue(value, inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
+            .map(key -> _)
+      }
+
+      evaluated map { mapping =>
+        val value = mapping.map(entry => entry._1 -> entry._2.value).toMap
+        val sideEffectFiles = mapping.flatMap(entry => entry._2.sideEffectFiles)
+        EvaluatedValue(WomObject(value), sideEffectFiles)
+      }
+    }
+  }
 }
diff --git a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/values.scala b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/values.scala
index 3e92a27b2b8..59d20a381d2 100644
--- a/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/values.scala
+++ b/wdl/transforms/cascades/src/main/scala/wdl/transforms/cascades/linking/expression/values/values.scala
@@ -39,6 +39,8 @@ package object values {
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: ObjectLiteral =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
+        case a: StructLiteral =>
+          a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: MapLiteral =>
           a.evaluateValue(inputs, ioFunctionSet, forCommandInstantiationOptions)(expressionValueEvaluator)
         case a: ArrayLiteral =>
diff --git a/wdl/transforms/cascades/src/test/cases/struct_literal.wdl b/wdl/transforms/cascades/src/test/cases/struct_literal.wdl
new file mode 100644
index 00000000000..b32150d7bd0
--- /dev/null
+++ b/wdl/transforms/cascades/src/test/cases/struct_literal.wdl
@@ -0,0 +1,39 @@
+version development
+
+struct Plant {
+    String color
+    Boolean tasty
+}
+
+struct Animal {
+    String name
+    Boolean? isGood
+}
+
+task test_struct_parsing {
+    input {
+        Plant standard_plant_input
+        Animal standard_animal_input
+    }
+
+    runtime {
+        docker: "ubuntu:latest"
+    }
+
+    command {
+       echo "all dogs are good"
+    }
+
+    output {
+        Plant standard_plant_forwarded = standard_plant_input
+        Animal standard_animal_forwarded = standard_animal_input
+        Plant plant_output_literal = Plant{color: "red", tasty: true}
+    }
+}
+
+workflow struct_literal {
+    call test_struct_parsing {
+         input: standard_plant_input = Plant{color: "green", tasty: true},
+            standard_animal_input = Animal{name: "mittens", isGood: false}
+         }
+}
diff --git a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/Ast2WdlomSpec.scala b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/Ast2WdlomSpec.scala
index ffc6d3bc131..971f5d54dc7 100644
--- a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/Ast2WdlomSpec.scala
+++ b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/Ast2WdlomSpec.scala
@@ -1,7 +1,6 @@
 package wdl.transforms.cascades
 
 import java.util
-
 import common.Checked
 import common.assertion.ErrorOrAssertions._
 import common.transforms.CheckedAtoB
@@ -19,7 +18,7 @@ import wdl.transforms.cascades.ast2wdlom._
 import wdl.transforms.cascades.parsing.WdlCascadesSyntaxErrorFormatter
 import wom.callable.MetaValueElement.MetaValueElementInteger
 import wom.types.WomIntegerType
-import wom.values.WomInteger
+import wom.values.{WomBoolean, WomInteger}
 
 import scala.jdk.CollectionConverters._
 
@@ -121,4 +120,13 @@ class Ast2WdlomSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
     val expr = fromString[ExpressionElement](str, parser.parse_e)
     expr shouldBeValid (Unzip(IdentifierLookup("some_array_of_pairs")))
   }
+
+  it should "parse a struct literal" in {
+    val str = """Dog{breed: "fluffy", isGood: true}"""
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+    expr shouldBeValid (StructLiteral(
+      "Dog",
+      Map("breed" -> StringLiteral("fluffy"), "isGood" -> PrimitiveLiteralExpressionElement(WomBoolean(true)))
+    ))
+  }
 }
diff --git a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/ast2wdlom/WdlFileToWdlomSpec.scala b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/ast2wdlom/WdlFileToWdlomSpec.scala
index 0a6a6f0e08e..8a8d691b8d7 100644
--- a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/ast2wdlom/WdlFileToWdlomSpec.scala
+++ b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/ast2wdlom/WdlFileToWdlomSpec.scala
@@ -10,7 +10,7 @@ import wdl.model.draft3.elements._
 import wdl.transforms.cascades.ast2wdlom.WdlFileToWdlomSpec._
 import wom.SourceFileLocation
 import wom.types._
-import wom.values.WomInteger
+import wom.values.{WomBoolean, WomInteger}
 
 class WdlFileToWdlomSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
 
@@ -367,6 +367,104 @@ object WdlFileToWdlomSpec {
           )
         ),
         tasks = Vector.empty
+      ),
+    "struct_literal" -> FileElement(
+      imports = Vector(),
+      structs = Vector(
+        StructElement("Plant",
+                      Vector(StructEntryElement("color", PrimitiveTypeElement(WomStringType)),
+                             StructEntryElement("tasty", PrimitiveTypeElement(WomBooleanType))
+                      )
+        ),
+        StructElement(
+          "Animal",
+          Vector(StructEntryElement("name", PrimitiveTypeElement(WomStringType)),
+                 StructEntryElement("isGood", OptionalTypeElement(PrimitiveTypeElement(WomBooleanType)))
+          )
+        )
+      ),
+      workflows = Vector(
+        WorkflowDefinitionElement(
+          "struct_literal",
+          None,
+          Set(
+            CallElement(
+              "test_struct_parsing",
+              None,
+              Vector(),
+              Some(
+                CallBodyElement(
+                  Vector(
+                    KvPair("standard_plant_input",
+                           StructLiteral("Plant",
+                                         Map("color" -> StringLiteral("green"),
+                                             "tasty" -> PrimitiveLiteralExpressionElement(WomBoolean(true))
+                                         )
+                           )
+                    ),
+                    KvPair("standard_animal_input",
+                           StructLiteral("Animal",
+                                         Map("name" -> StringLiteral("mittens"),
+                                             "isGood" -> PrimitiveLiteralExpressionElement(WomBoolean(false))
+                                         )
+                           )
+                    )
+                  )
+                )
+              ),
+              Some(SourceFileLocation(35))
+            )
+          ),
+          None,
+          None,
+          None,
+          Some(SourceFileLocation(34))
+        )
+      ),
+      tasks = Vector(
+        TaskDefinitionElement(
+          "test_struct_parsing",
+          Some(
+            InputsSectionElement(
+              Vector(
+                InputDeclarationElement(TypeAliasElement("Plant"), "standard_plant_input", None),
+                InputDeclarationElement(TypeAliasElement("Animal"), "standard_animal_input", None)
+              )
+            )
+          ),
+          Vector(),
+          Some(
+            OutputsSectionElement(
+              Vector(
+                OutputDeclarationElement(TypeAliasElement("Plant"),
+                                         "standard_plant_forwarded",
+                                         IdentifierLookup("standard_plant_input")
+                ),
+                OutputDeclarationElement(TypeAliasElement("Animal"),
+                                         "standard_animal_forwarded",
+                                         IdentifierLookup("standard_animal_input")
+                ),
+                OutputDeclarationElement(
+                  TypeAliasElement("Plant"),
+                  "plant_output_literal",
+                  StructLiteral("Plant",
+                                Map("color" -> StringLiteral("red"),
+                                    "tasty" -> PrimitiveLiteralExpressionElement(WomBoolean(true))
+                                )
+                  )
+                )
+              )
+            )
+          ),
+          CommandSectionElement(
+            List(CommandSectionLine(Vector(StringCommandPartElement("""echo "all dogs are good""""))))
+          ),
+          Some(RuntimeAttributesSectionElement(Vector(KvPair("docker", StringLiteral("ubuntu:latest"))))),
+          None,
+          None,
+          Some(SourceFileLocation(13))
+        )
       )
+    )
   )
 }
diff --git a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumersSpec.scala b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumersSpec.scala
index 9e47424d6c5..2d1f5c0b812 100644
--- a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumersSpec.scala
+++ b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/consumed/CascadesExpressionValueConsumersSpec.scala
@@ -111,4 +111,13 @@ class CascadesExpressionValueConsumersSpec extends AnyFlatSpec with CromwellTime
       e.expressionConsumedValueHooks should be(Set(UnlinkedIdentifierHook("my_array_of_pairs")))
     }
   }
+
+  it should "discover an array variable lookup within a struct literal member access" in {
+    val str = """ (StructWithAnArray{myArrayMember: arrayToLookup}).myArray """
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+
+    expr.shouldBeValidPF { case e =>
+      e.expressionConsumedValueHooks should be(Set(UnlinkedIdentifierHook("arrayToLookup")))
+    }
+  }
 }
diff --git a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluatorSpec.scala b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluatorSpec.scala
index afc73a56a32..60ca92d2fc8 100644
--- a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluatorSpec.scala
+++ b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/files/CascadesFileEvaluatorSpec.scala
@@ -100,4 +100,15 @@ class CascadesFileEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec wit
       )
     }
   }
+
+  it should "discover the file which would be required to evaluate a struct literal" in {
+    val str = """ StructWithStringVec{myVec: read_lines("foo.txt")}"""
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+
+    expr.shouldBeValidPF { case e =>
+      e.predictFilesNeededToEvaluate(Map.empty, NoIoFunctionSet, WomStringType) shouldBeValid Set(
+        WomSingleFile("foo.txt")
+      )
+    }
+  }
 }
diff --git a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluatorSpec.scala b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluatorSpec.scala
index d874fb7e6dd..0bef2d7a6ef 100644
--- a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluatorSpec.scala
+++ b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/types/CascadesTypeEvaluatorSpec.scala
@@ -131,4 +131,14 @@ class CascadesTypeEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec wit
       e.evaluateType(Map.empty) shouldBeValid WomPairType(WomArrayType(WomAnyType), WomArrayType(WomAnyType))
     }
   }
+
+  it should "evaluate the type of a struct literal" in {
+    // NB: This is not yet strict enough type checking for the WDL 1.1 spec.
+    // In a subsequent branch, we will make this be a WomCompositeType that matches the struct definition.
+    val structLiteral = """ Animal{fur: "fuzzy", isGood: true} """
+    val structExpr = fromString[ExpressionElement](structLiteral, parser.parse_e)
+    structExpr.shouldBeValidPF { case e =>
+      e.evaluateType(Map.empty) shouldBeValid WomObjectType
+    }
+  }
 }
diff --git a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluatorSpec.scala b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluatorSpec.scala
index 60215046d05..68027a868af 100644
--- a/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluatorSpec.scala
+++ b/wdl/transforms/cascades/src/test/scala/wdl/transforms/cascades/linking/expression/values/CascadesValueEvaluatorSpec.scala
@@ -12,7 +12,7 @@ import wdl.transforms.cascades.Ast2WdlomSpec.{fromString, parser}
 import wdl.transforms.cascades.ast2wdlom._
 import wom.expression.NoIoFunctionSet
 import wom.types.{WomAnyType, WomArrayType, WomIntegerType, WomMapType, WomOptionalType, WomStringType}
-import wom.values.{WomArray, WomInteger, WomMap, WomOptionalValue, WomPair, WomString}
+import wom.values.{WomArray, WomBoolean, WomInteger, WomMap, WomObject, WomOptionalValue, WomPair, WomString}
 
 class CascadesValueEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
 
@@ -408,4 +408,14 @@ class CascadesValueEvaluatorSpec extends AnyFlatSpec with CromwellTimeoutSpec wi
         )
     )
   }
+
+  it should "evaluate a struct literal" in {
+    val literal = """ Animal{type: "dog", barks: false}"""
+    val expectedValue = WomObject(Map("type" -> WomString("dog"), "barks" -> WomBoolean(false)))
+    val expr = fromString[ExpressionElement](literal, parser.parse_e)
+
+    expr.shouldBeValidPF { case e =>
+      e.evaluateValue(Map.empty, NoIoFunctionSet, None) shouldBeValid EvaluatedValue(expectedValue, Seq.empty)
+    }
+  }
 }
diff --git a/wdl/transforms/draft3/src/test/scala/wdl/draft3/transforms/ast2wdlom/Ast2WdlomSpec.scala b/wdl/transforms/draft3/src/test/scala/wdl/draft3/transforms/ast2wdlom/Ast2WdlomSpec.scala
index d7f507b8343..2865d977f7d 100644
--- a/wdl/transforms/draft3/src/test/scala/wdl/draft3/transforms/ast2wdlom/Ast2WdlomSpec.scala
+++ b/wdl/transforms/draft3/src/test/scala/wdl/draft3/transforms/ast2wdlom/Ast2WdlomSpec.scala
@@ -93,4 +93,12 @@ class Ast2WdlomSpec extends AnyFlatSpec with CromwellTimeoutSpec with Matchers {
     val expr = fromString[ExpressionElement](str, parser.parse_e)
     expr shouldBeInvalid "Failed to parse expression (reason 1 of 1): Unknown engine function: 'unzip'"
   }
+
+  it should "not parse a struct literal" in {
+    val str = """Dog{breed: "fluffy", isGood: true}"""
+    val expr = fromString[ExpressionElement](str, parser.parse_e)
+    // parser interprets "Dog" as an identifier, rather than as part of a struct literal,
+    // since struct literals aren't in WDL 1.0
+    expr shouldBeValid (IdentifierLookup("Dog"))
+  }
 }
diff --git a/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/ast2wdlom/AstNodeToExpressionElement.scala b/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/ast2wdlom/AstNodeToExpressionElement.scala
index acf3eac9f0b..49bb1c68df6 100644
--- a/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/ast2wdlom/AstNodeToExpressionElement.scala
+++ b/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/ast2wdlom/AstNodeToExpressionElement.scala
@@ -57,6 +57,12 @@ object AstNodeToExpressionElement {
           objectKvs <- a.getAttributeAsVector[KvPair]("map")
           asMap = objectKvs.map(kv => kv.key -> kv.value).toMap
         } yield ObjectLiteral(asMap)).toValidated
+      case a: GenericAst if a.getName == "StructLiteral" =>
+        (for {
+          objectKvs <- a.getAttributeAsVector[KvPair]("map")
+          asMap = objectKvs.map(kv => kv.key -> kv.value).toMap
+          structTypeName <- a.getAttributeAs[String]("name")
+        } yield StructLiteral(structTypeName, asMap)).toValidated
       case a: GenericAst if a.getName == "MapLiteral" =>
         final case class MapKvPair(key: ExpressionElement, value: ExpressionElement)
         def convertOnePair(astNode: GenericAstNode): ErrorOr[MapKvPair] = astNode match {
diff --git a/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/wdlom2wdl/WdlWriterImpl.scala b/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/wdlom2wdl/WdlWriterImpl.scala
index d4a0b043b17..ab63d0be7c0 100644
--- a/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/wdlom2wdl/WdlWriterImpl.scala
+++ b/wdl/transforms/new-base/src/main/scala/wdl/transforms/base/wdlom2wdl/WdlWriterImpl.scala
@@ -39,6 +39,12 @@ object WdlWriterImpl {
             pair._1 + ": " + expressionElementWriter.toWdlV1(pair._2)
           }
           .mkString(", ") + " }"
+      case a: StructLiteral =>
+        a.structTypeName + " { " + a.elements
+          .map { pair =>
+            pair._1 + ": " + expressionElementWriter.toWdlV1(pair._2)
+          }
+          .mkString(", ") + " }"
       case a: ArrayLiteral =>
         "[" + a.elements.map(expressionElementWriter.toWdlV1).mkString(", ") + "]"
       case a: MapLiteral =>