You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2021/10/07 17:05:55 UTC

[plc4x] branch feature/mspec-ng updated: fix: Continued implementing the arguments in the parser fix: Set a byteOrder argument on every root-type in our mspec grammars

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/mspec-ng
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/mspec-ng by this push:
     new 611bed9  fix: Continued implementing the arguments in the parser fix: Set a byteOrder argument on every root-type in our mspec grammars
611bed9 is described below

commit 611bed990ce35c10f8e1d21c1bfd209304e368c4
Author: cdutz <ch...@c-ware.de>
AuthorDate: Thu Oct 7 19:05:43 2021 +0200

    fix: Continued implementing the arguments in the parser
    fix: Set a byteOrder argument on every root-type in our mspec grammars
---
 .../definitions/DefaultComplexTypeDefinition.java  |  10 +-
 .../definitions/DefaultDataIoTypeDefinition.java   |   6 +-
 .../DefaultDiscriminatedComplexTypeDefinition.java |   6 +-
 .../definitions/DefaultEnumTypeDefinition.java     |   7 +-
 .../model/definitions/DefaultTypeDefinition.java   |  19 ++-
 .../mspec/model/fields/DefaultAbstractField.java   |   5 +-
 .../mspec/model/fields/DefaultArrayField.java      |   5 +-
 .../mspec/model/fields/DefaultAssertField.java     |   5 +-
 .../mspec/model/fields/DefaultChecksumField.java   |   9 +-
 .../mspec/model/fields/DefaultConstField.java      |   9 +-
 .../model/fields/DefaultDiscriminatorField.java    |   9 +-
 .../mspec/model/fields/DefaultEnumField.java       |   5 +-
 .../language/mspec/model/fields/DefaultField.java  |  22 ++-
 .../mspec/model/fields/DefaultImplicitField.java   |   9 +-
 .../model/fields/DefaultManualArrayField.java      |   5 +-
 .../mspec/model/fields/DefaultManualField.java     |   5 +-
 .../mspec/model/fields/DefaultOptionalField.java   |   5 +-
 .../mspec/model/fields/DefaultPaddingField.java    |   5 +-
 .../mspec/model/fields/DefaultReservedField.java   |   9 +-
 .../mspec/model/fields/DefaultSimpleField.java     |   5 +-
 .../mspec/model/fields/DefaultSwitchField.java     |  12 +-
 .../mspec/model/fields/DefaultTaggedField.java     |  40 ------
 .../mspec/model/fields/DefaultUnknownField.java    |   9 +-
 .../mspec/model/fields/DefaultVirtualField.java    |   9 +-
 .../mspec/parser/MessageFormatListener.java        | 159 +++++++++++++--------
 .../main/resources/protocols/abeth/ab-eth.mspec    |   2 +-
 .../resources/protocols/ads/ads-discovery.mspec    |  22 +--
 .../ads/src/main/resources/protocols/ads/ads.mspec |   2 +-
 .../resources/protocols/bacnetip/bacnetip.mspec    |   2 +-
 .../src/main/resources/protocols/can/canopen.mspec |   2 +-
 .../df1/src/main/resources/protocols/df1/df1.mspec |   2 +-
 .../eip/src/main/resources/protocols/eip/eip.mspec |   2 +-
 .../main/resources/protocols/firmata/firmata.mspec |   2 +-
 .../main/resources/protocols/can/genericcan.mspec  |   2 +-
 .../resources/protocols/knxnetip/knxnetip.mspec    |   2 +-
 .../main/resources/protocols/modbus/modbus.mspec   |   4 +-
 protocols/opcua/src/main/xslt/opc-manual.xsl       |   2 +-
 .../src/main/resources/protocols/plc4x/plc4x.mspec |   2 +-
 .../resources/protocols/profinet/profinet.mspec    |  44 +++---
 .../s7/src/main/resources/protocols/s7/s7.mspec    |   2 +-
 .../resources/protocols/simulated/simulated.mspec  |   2 +-
 .../main/resources/protocols/can/socketcan.mspec   |   2 +-
 42 files changed, 251 insertions(+), 236 deletions(-)

diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
index 9fdae0b..6007042 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
@@ -21,11 +21,9 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.fields.*;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implements ComplexTypeDefinition {
@@ -33,8 +31,8 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
     private final boolean isAbstract;
     private final List<Field> fields;
 
-    public DefaultComplexTypeDefinition(String name, List<Argument> parserArguments, List<String> tags, boolean isAbstract, List<Field> fields) {
-        super(name, parserArguments, tags);
+    public DefaultComplexTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments, boolean isAbstract, List<Field> fields) {
+        super(name, attributes, parserArguments);
         this.isAbstract = isAbstract;
         this.fields = Objects.requireNonNull(fields);
     }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
index 396063c..9b92ae4 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
@@ -24,8 +24,10 @@ import org.apache.plc4x.plugins.codegenerator.types.definitions.DataIoTypeDefini
 import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
 import org.apache.plc4x.plugins.codegenerator.types.references.DefaultComplexTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 public class DefaultDataIoTypeDefinition extends DefaultTypeDefinition implements DataIoTypeDefinition {
@@ -33,8 +35,8 @@ public class DefaultDataIoTypeDefinition extends DefaultTypeDefinition implement
     private final SwitchField switchField;
     private final TypeReference type;
 
-    public DefaultDataIoTypeDefinition(String name, List<Argument> parserArguments, List<String> tags, SwitchField switchField) {
-        super(name, parserArguments, tags);
+    public DefaultDataIoTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments, SwitchField switchField) {
+        super(name, attributes, parserArguments);
         this.switchField = Objects.requireNonNull(switchField);
         if (parserArguments.size() < 1) {
             throw new IllegalStateException();
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
index 9bbec47..c073451 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
@@ -22,16 +22,18 @@ import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField;
 import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 public class DefaultDiscriminatedComplexTypeDefinition extends DefaultComplexTypeDefinition implements DiscriminatedComplexTypeDefinition {
 
     private final List<String> discriminatorValues;
 
-    public DefaultDiscriminatedComplexTypeDefinition(String name, List<Argument> parserArguments, List<String> tags, List<String> discriminatorValues, List<Field> fields) {
-        super(name, parserArguments, tags, false, fields);
+    public DefaultDiscriminatedComplexTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments, List<String> discriminatorValues, List<Field> fields) {
+        super(name, attributes, parserArguments, false, fields);
         this.discriminatorValues = Objects.requireNonNull(discriminatorValues);
     }
 
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
index 730213f..a149d8a 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
@@ -22,6 +22,7 @@ import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.EnumTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.enums.EnumValue;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.*;
 
@@ -31,9 +32,9 @@ public class DefaultEnumTypeDefinition extends DefaultTypeDefinition implements
     private final List<EnumValue> enumValues;
     private final Map<String, TypeReference> constants;
 
-    public DefaultEnumTypeDefinition(String name, TypeReference type, List<EnumValue> enumValues,
-                                     List<Argument> constants, List<String> tags) {
-        super(name, constants, tags);
+    public DefaultEnumTypeDefinition(String name, TypeReference type, Map<String, Term> attributes, List<EnumValue> enumValues,
+                                     List<Argument> constants) {
+        super(name, attributes, constants);
         this.type = Objects.requireNonNull(type);
         this.enumValues = Objects.requireNonNull(enumValues);
         this.constants = new HashMap<>();
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
index a105dfd..de8b9ab 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
@@ -23,22 +23,24 @@ import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.references.DefaultComplexTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
 public abstract class DefaultTypeDefinition {
 
     protected final String name;
+    private final Map<String, Term> attributes;
     protected final List<Argument> parserArguments;
-    protected final List<String> tags;
     protected TypeDefinition parentType;
 
-    public DefaultTypeDefinition(String name, List<Argument> parserArguments, List<String> tags) {
+    public DefaultTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments) {
         this.name = Objects.requireNonNull(name);
+        this.attributes = attributes;
         this.parserArguments = parserArguments;
-        this.tags = tags;
         this.parentType = null;
     }
 
@@ -46,12 +48,15 @@ public abstract class DefaultTypeDefinition {
         return name;
     }
 
-    public Optional<List<Argument>> getParserArguments() {
-        return Optional.ofNullable(parserArguments);
+    public Optional<Term> getAttribute(String attributeName) {
+        if(attributes.containsKey(attributeName)) {
+            return Optional.of(attributes.get(attributeName));
+        }
+        return Optional.empty();
     }
 
-    public Optional<List<String>> getTags() {
-        return Optional.ofNullable(tags);
+    public Optional<List<Argument>> getParserArguments() {
+        return Optional.ofNullable(parserArguments);
     }
 
     public TypeDefinition getParentType() {
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
index e2cd52a..d83e723 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -32,8 +33,8 @@ public class DefaultAbstractField extends DefaultField implements AbstractField
     private final String name;
     private final List<Term> params;
 
-    public DefaultAbstractField(List<String> tags, TypeReference type, String name, List<Term> params) {
-        super(tags);
+    public DefaultAbstractField(Map<String, Term> attributes, TypeReference type, String name, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.params = params;
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
index 6592155..0ce991cf 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -34,8 +35,8 @@ public class DefaultArrayField extends DefaultField implements ArrayField {
     private final Term loopExpression;
     private final List<Term> params;
 
-    public DefaultArrayField(List<String> tags, TypeReference type, String name, LoopType loopType, Term loopExpression, List<Term> params) {
-        super(tags);
+    public DefaultArrayField(Map<String, Term> attributes, TypeReference type, String name, LoopType loopType, Term loopExpression, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.loopType = Objects.requireNonNull(loopType);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
index 4ee6a9f..ef14dc7 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAssertField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -33,8 +34,8 @@ public class DefaultAssertField extends DefaultField implements AssertField {
     private final Term conditionExpression;
     private final List<Term> params;
 
-    public DefaultAssertField(List<String> tags, TypeReference type, String name, Term conditionExpression, List<Term> params) {
-        super(tags);
+    public DefaultAssertField(Map<String, Term> attributes, TypeReference type, String name, Term conditionExpression, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.conditionExpression = Objects.requireNonNull(conditionExpression);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
index fe0ad56..17b62b2 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultChecksumField.java
@@ -22,10 +22,7 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.ChecksumField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultChecksumField extends DefaultField implements ChecksumField {
 
@@ -33,8 +30,8 @@ public class DefaultChecksumField extends DefaultField implements ChecksumField
     private final String name;
     private final Term checksumExpression;
 
-    public DefaultChecksumField(List<String> tags, TypeReference type, String name, Term checksumExpression) {
-        super(tags);
+    public DefaultChecksumField(Map<String, Term> attributes, TypeReference type, String name, Term checksumExpression) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.checksumExpression = Objects.requireNonNull(checksumExpression);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
index 26f7a67..681f2f8 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
@@ -22,10 +22,7 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.ConstField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultConstField extends DefaultField implements ConstField {
 
@@ -33,8 +30,8 @@ public class DefaultConstField extends DefaultField implements ConstField {
     private final String name;
     private final Object referenceValue;
 
-    public DefaultConstField(List<String> tags, TypeReference type, String name, Object referenceValue) {
-        super(tags);
+    public DefaultConstField(Map<String, Term> attributes, TypeReference type, String name, Object referenceValue) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.referenceValue = Objects.requireNonNull(referenceValue);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
index 3e23b6d..6ff4481 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
@@ -22,18 +22,15 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultDiscriminatorField extends DefaultField implements DiscriminatorField {
 
     private final TypeReference type;
     private final String name;
 
-    public DefaultDiscriminatorField(List<String> tags, TypeReference type, String name) {
-        super(tags);
+    public DefaultDiscriminatorField(Map<String, Term> attributes, TypeReference type, String name) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
     }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
index 96db23c..f56fdf6 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -33,8 +34,8 @@ public class DefaultEnumField extends DefaultField implements EnumField {
     private final String fieldName;
     private final List<Term> params;
 
-    public DefaultEnumField(List<String> tags, TypeReference type, String name, String fieldName, List<Term> params) {
-        super(tags);
+    public DefaultEnumField(Map<String, Term> attributes, TypeReference type, String name, String fieldName, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.fieldName = fieldName;
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
index 0bed904..7491eb8 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultField.java
@@ -18,12 +18,26 @@
  */
 package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import java.util.List;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-public abstract class DefaultField extends DefaultTaggedField {
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 
-    protected DefaultField(List<String> tags) {
-        super(tags);
+public abstract class DefaultField {
+
+    private final Map<String, Term> attributes;
+
+    protected DefaultField(Map<String, Term> attributes) {
+        super();
+        this.attributes = Objects.requireNonNull(attributes);
+    }
+
+    public Optional<Term> getAttribute(String attributeName) {
+        if(attributes.containsKey(attributeName)) {
+            return Optional.of(attributes.get(attributeName));
+        }
+        return Optional.empty();
     }
 
 }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
index e12b333..c00597d 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
@@ -22,10 +22,7 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.ImplicitField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultImplicitField extends DefaultField implements ImplicitField {
 
@@ -33,8 +30,8 @@ public class DefaultImplicitField extends DefaultField implements ImplicitField
     private final String name;
     private final Term serializeExpression;
 
-    public DefaultImplicitField(List<String> tags, TypeReference type, String name, Term serializeExpression) {
-        super(tags);
+    public DefaultImplicitField(Map<String, Term> attributes, TypeReference type, String name, Term serializeExpression) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.serializeExpression = Objects.requireNonNull(serializeExpression);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
index 80d875a..40463ad 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -37,8 +38,8 @@ public class DefaultManualArrayField extends DefaultField implements ManualArray
     private final Term lengthExpression;
     private final List<Term> params;
 
-    public DefaultManualArrayField(List<String> tags, TypeReference type, String name, LoopType loopType, Term loopExpression, Term parseExpression, Term serializeExpression, Term lengthExpression, List<Term> params) {
-        super(tags);
+    public DefaultManualArrayField(Map<String, Term> attributes, TypeReference type, String name, LoopType loopType, Term loopExpression, Term parseExpression, Term serializeExpression, Term lengthExpression, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.loopType = Objects.requireNonNull(loopType);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
index 6777652..926f978 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -35,8 +36,8 @@ public class DefaultManualField extends DefaultField implements ManualField {
     private final Term lengthExpression;
     private final List<Term> params;
 
-    public DefaultManualField(List<String> tags, TypeReference type, String name, Term parseExpression, Term serializeExpression, Term lengthExpression, List<Term> params) {
-        super(tags);
+    public DefaultManualField(Map<String, Term> attributes, TypeReference type, String name, Term parseExpression, Term serializeExpression, Term lengthExpression, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.parseExpression = Objects.requireNonNull(parseExpression);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
index 50e5463..295bc17 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -33,8 +34,8 @@ public class DefaultOptionalField extends DefaultField implements OptionalField
     private final Term conditionExpression;
     private final List<Term> params;
 
-    public DefaultOptionalField(List<String> tags, TypeReference type, String name, Term conditionExpression, List<Term> params) {
-        super(tags);
+    public DefaultOptionalField(Map<String, Term> attributes, TypeReference type, String name, Term conditionExpression, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.conditionExpression = conditionExpression;
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
index 26f63b4..a8a2ad4 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultPaddingField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -34,8 +35,8 @@ public class DefaultPaddingField extends DefaultField implements PaddingField {
     private final Term paddingCondition;
     private final List<Term> params;
 
-    public DefaultPaddingField(List<String> tags, TypeReference type, String name, Term paddingValue, Term paddingCondition, List<Term> params) {
-        super(tags);
+    public DefaultPaddingField(Map<String, Term> attributes, TypeReference type, String name, Term paddingValue, Term paddingCondition, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.paddingValue = Objects.requireNonNull(paddingValue);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
index 5d803e1..f12f9b4 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
@@ -22,18 +22,15 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.ReservedField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultReservedField extends DefaultField implements ReservedField {
 
     private final TypeReference type;
     private final Object referenceValue;
 
-    public DefaultReservedField(List<String> tags, TypeReference type, Object referenceValue) {
-        super(tags);
+    public DefaultReservedField(Map<String, Term> attributes, TypeReference type, Object referenceValue) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.referenceValue = Objects.requireNonNull(referenceValue);
     }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
index 5b5c3a7..41b4947 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -32,8 +33,8 @@ public class DefaultSimpleField extends DefaultField implements SimpleField {
     private final String name;
     private final List<Term> params;
 
-    public DefaultSimpleField(List<String> tags, TypeReference type, String name, List<Term> params) {
-        super(tags);
+    public DefaultSimpleField(Map<String, Term> attributes, TypeReference type, String name, List<Term> params) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.params = params;
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
index a96b5d2..118b242 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
@@ -27,12 +27,10 @@ import java.util.*;
 
 public class DefaultSwitchField implements SwitchField {
 
-    private final boolean isTry;
     private final List<Term> discriminatorExpressions;
     private final List<DiscriminatedComplexTypeDefinition> cases;
 
-    public DefaultSwitchField(boolean isTry, List<Term> discriminatorExpressions) {
-        this.isTry = isTry;
+    public DefaultSwitchField(List<Term> discriminatorExpressions) {
         this.discriminatorExpressions = Objects.requireNonNull(discriminatorExpressions);
         this.cases = new LinkedList<>();
     }
@@ -50,11 +48,13 @@ public class DefaultSwitchField implements SwitchField {
         return cases;
     }
 
+    @Override
+    public Optional<Term> getAttribute(String attributeName) {
+        return Optional.empty();
+    }
+
     public Optional<List<Term>> getParams() {
         return Optional.of(Collections.emptyList());
     }
 
-    public boolean isTry() {
-        return isTry;
-    }
 }
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTaggedField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTaggedField.java
deleted file mode 100644
index ce44570..0000000
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultTaggedField.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
-
-import org.apache.plc4x.plugins.codegenerator.types.fields.TaggedField;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-public abstract class DefaultTaggedField implements TaggedField {
-
-    private final List<String> tags;
-
-    public DefaultTaggedField(List<String> tags) {
-        this.tags = tags;
-    }
-
-    @Override
-    public Optional<List<String>> getTags() {
-        return Optional.ofNullable(tags);
-    }
-
-}
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
index 5550e55..8f2f052 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultUnknownField.java
@@ -22,17 +22,14 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.UnknownField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultUnknownField extends DefaultField implements UnknownField {
 
     private final TypeReference type;
 
-    public DefaultUnknownField(List<String> tags, TypeReference type) {
-        super(tags);
+    public DefaultUnknownField(Map<String, Term> attributes, TypeReference type) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
     }
 
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
index 2b1f35c..a491647 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultVirtualField.java
@@ -22,10 +22,7 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField;
 import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 
 public class DefaultVirtualField extends DefaultField implements VirtualField {
 
@@ -33,8 +30,8 @@ public class DefaultVirtualField extends DefaultField implements VirtualField {
     private final String name;
     private final Term valueExpression;
 
-    public DefaultVirtualField(List<String> tags, TypeReference type, String name, Term valueExpression) {
-        super(tags);
+    public DefaultVirtualField(Map<String, Term> attributes, TypeReference type, String name, Term valueExpression) {
+        super(attributes);
         this.type = Objects.requireNonNull(type);
         this.name = Objects.requireNonNull(name);
         this.valueExpression = Objects.requireNonNull(valueExpression);
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 9bddc5a..9566d30 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -18,6 +18,7 @@
  */
 package org.apache.plc4x.plugins.codegenerator.language.mspec.parser;
 
+import org.antlr.v4.runtime.RuleContext;
 import org.apache.commons.io.IOUtils;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecBaseListener;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecParser;
@@ -50,6 +51,8 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     private Map<String, TypeDefinition> types;
 
+    private Stack<Map<String, Term>> batchSetAttributes = new Stack<>();
+
     public Deque<List<Field>> getParserContexts() {
         return parserContexts;
     }
@@ -71,6 +74,16 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     @Override
     public void enterComplexType(MSpecParser.ComplexTypeContext ctx) {
+        // Set a map of attributes that should be set for all fields.
+        Map<String, Term> curBatchSetAttributes = new HashMap<>();
+        // Add all attributes defined in the current batchSet field.
+        for (MSpecParser.AttributeContext attributeContext : ctx.attributes.attribute()) {
+            Term attributeExpression = getExpressionTerm(attributeContext.value);
+            curBatchSetAttributes.put(attributeContext.name.getText(), attributeExpression);
+        }
+        // Make the new Map the top of the stack.
+        batchSetAttributes.push(curBatchSetAttributes);
+
         if (ctx.enumValues != null) {
             List<EnumValue> enumContext = new LinkedList<>();
             enumContexts.push(enumContext);
@@ -88,6 +101,7 @@ public class MessageFormatListener extends MSpecBaseListener {
             parserArguments = getParserArguments(ctx.params.argument());
         }
 
+        final Map<String, Term> attributes = batchSetAttributes.peek();
         // Handle enum types.
         if (ctx.enumValues != null) {
             TypeReference type = (ctx.type != null) ? getTypeReference(ctx.type) : null;
@@ -96,14 +110,14 @@ public class MessageFormatListener extends MSpecBaseListener {
                 // in case there is no type we default to uint32
                 type = new DefaultIntegerTypeReference(SimpleTypeReference.SimpleBaseType.UINT, 32);
             }
-            DefaultEnumTypeDefinition enumType = new DefaultEnumTypeDefinition(typeName, type, enumValues,
-                parserArguments, null);
+            DefaultEnumTypeDefinition enumType = new DefaultEnumTypeDefinition(typeName, type, attributes, enumValues,
+                parserArguments);
             types.put(typeName, enumType);
             enumContexts.pop();
         } else if (ctx.dataIoTypeSwitch != null) {  // Handle data-io types.
             SwitchField switchField = getSwitchField();
             DefaultDataIoTypeDefinition type = new DefaultDataIoTypeDefinition(
-                typeName, parserArguments, null, switchField);
+                typeName, attributes, parserArguments, switchField);
             types.put(typeName, type);
 
             // Set the parent type for all sub-types.
@@ -119,7 +133,8 @@ public class MessageFormatListener extends MSpecBaseListener {
             // If the type has sub-types it's an abstract type.
             SwitchField switchField = getSwitchField();
             boolean abstractType = switchField != null;
-            DefaultComplexTypeDefinition type = new DefaultComplexTypeDefinition(typeName, parserArguments, null, abstractType, parserContexts.peek());
+            DefaultComplexTypeDefinition type = new DefaultComplexTypeDefinition(
+                typeName, attributes, parserArguments, abstractType, parserContexts.peek());
             types.put(typeName, type);
 
             // Set the parent type for all sub-types.
@@ -135,12 +150,35 @@ public class MessageFormatListener extends MSpecBaseListener {
     }
 
     @Override
+    public void enterBatchSetDefinition(MSpecParser.BatchSetDefinitionContext ctx) {
+        // Set a map of attributes that should be set for all fields.
+        Map<String, Term> curBatchSetAttributes = new HashMap<>();
+        // Add all attributes of the lower layers and initialize the new map with it.
+        if(!batchSetAttributes.empty()) {
+            curBatchSetAttributes.putAll(batchSetAttributes.peek());
+        }
+        // Add all attributes defined in the current batchSet field.
+        for (MSpecParser.AttributeContext attributeContext : ctx.attributes.attribute()) {
+            Term attributeExpression = getExpressionTerm(attributeContext.value);
+            curBatchSetAttributes.put(attributeContext.name.getText(), attributeExpression);
+        }
+        // Make the new Map the top of the stack.
+        batchSetAttributes.push(curBatchSetAttributes);
+    }
+
+    @Override
+    public void exitBatchSetDefinition(MSpecParser.BatchSetDefinitionContext ctx) {
+        // Clear the map of attributes.
+        batchSetAttributes.pop();
+    }
+
+    @Override
     public void enterAbstractField(MSpecParser.AbstractFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultAbstractField(null, type, name, params);
+        Field field = new DefaultAbstractField(getAttributes(ctx), type, name, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -151,11 +189,10 @@ public class MessageFormatListener extends MSpecBaseListener {
         TypeReference type = getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
         ArrayField.LoopType loopType = ArrayField.LoopType.valueOf(ctx.loopType.getText().toUpperCase());
-        String loopExpressionString = getExprString(ctx.loopExpression);
-        Term loopExpression = getExpressionTerm(loopExpressionString);
+        Term loopExpression = getExpressionTerm(ctx.loopExpression);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultArrayField(null, type, name, loopType, loopExpression, params);
+        Field field = new DefaultArrayField(getAttributes(ctx), type, name, loopType, loopExpression, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -165,9 +202,8 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterChecksumField(MSpecParser.ChecksumFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        String checksumExpressionString = getExprString(ctx.checksumExpression);
-        Term checksumExpression = getExpressionTerm(checksumExpressionString);
-        Field field = new DefaultChecksumField(null, type, name, checksumExpression);
+        Term checksumExpression = getExpressionTerm(ctx.checksumExpression);
+        Field field = new DefaultChecksumField(getAttributes(ctx), type, name, checksumExpression);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -178,7 +214,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         TypeReference type = ctx.type.dataType() != null ? getSimpleTypeReference(ctx.type.dataType()) : getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
         String expected = getExprString(ctx.expected);
-        Field field = new DefaultConstField(null, type, name, expected);
+        Field field = new DefaultConstField(getAttributes(ctx), type, name, expected);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -188,7 +224,7 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterDiscriminatorField(MSpecParser.DiscriminatorFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        Field field = new DefaultDiscriminatorField(null, type, name);
+        Field field = new DefaultDiscriminatorField(getAttributes(ctx), type, name);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -204,7 +240,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         }
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultEnumField(null, type, name, fieldName, params);
+        Field field = new DefaultEnumField(getAttributes(ctx), type, name, fieldName, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -214,9 +250,8 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterImplicitField(MSpecParser.ImplicitFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        String serializeExpressionString = getExprString(ctx.serializeExpression);
-        Term serializeExpression = getExpressionTerm(serializeExpressionString);
-        Field field = new DefaultImplicitField(null, type, name, serializeExpression);
+        Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
+        Field field = new DefaultImplicitField(getAttributes(ctx), type, name, serializeExpression);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -226,11 +261,10 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterAssertField(MSpecParser.AssertFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        String conditionExpressionString = getExprString(ctx.condition);
-        Term conditionExpression = getExpressionTerm(conditionExpressionString);
+        Term conditionExpression = getExpressionTerm(ctx.condition);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultAssertField(null, type, name, conditionExpression, params);
+        Field field = new DefaultAssertField(getAttributes(ctx), type, name, conditionExpression, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -242,17 +276,13 @@ public class MessageFormatListener extends MSpecBaseListener {
         String name = getIdString(ctx.name);
         ManualArrayField.LoopType loopType = ManualArrayField.LoopType.valueOf(
             ctx.loopType.getText().toUpperCase());
-        String loopExpressionString = getExprString(ctx.loopExpression);
-        Term loopExpression = getExpressionTerm(loopExpressionString);
-        String parseExpressionString = getExprString(ctx.parseExpression);
-        Term parseExpression = getExpressionTerm(parseExpressionString);
-        String serializeExpressionString = getExprString(ctx.serializeExpression);
-        Term serializeExpression = getExpressionTerm(serializeExpressionString);
-        String lengthExpressionString = getExprString(ctx.lengthExpression);
-        Term lengthExpression = getExpressionTerm(lengthExpressionString);
+        Term loopExpression = getExpressionTerm(ctx.loopExpression);
+        Term parseExpression = getExpressionTerm(ctx.parseExpression);
+        Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
+        Term lengthExpression = getExpressionTerm(ctx.lengthExpression);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultManualArrayField(null, type, name, loopType, loopExpression,
+        Field field = new DefaultManualArrayField(getAttributes(ctx), type, name, loopType, loopExpression,
             parseExpression, serializeExpression, lengthExpression, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
@@ -263,15 +293,12 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterManualField(MSpecParser.ManualFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        String parseExpressionString = getExprString(ctx.parseExpression);
-        Term parseExpression = getExpressionTerm(parseExpressionString);
-        String serializeExpressionString = getExprString(ctx.serializeExpression);
-        Term serializeExpression = getExpressionTerm(serializeExpressionString);
-        String lengthExpressionString = getExprString(ctx.lengthExpression);
-        Term lengthExpression = getExpressionTerm(lengthExpressionString);
+        Term parseExpression = getExpressionTerm(ctx.parseExpression);
+        Term serializeExpression = getExpressionTerm(ctx.serializeExpression);
+        Term lengthExpression = getExpressionTerm(ctx.lengthExpression);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultManualField(null, type, name, parseExpression, serializeExpression,
+        Field field = new DefaultManualField(getAttributes(ctx), type, name, parseExpression, serializeExpression,
             lengthExpression, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
@@ -284,12 +311,11 @@ public class MessageFormatListener extends MSpecBaseListener {
         String name = getIdString(ctx.name);
         Term conditionExpression = null;
         if (ctx.condition != null) {
-            String conditionExpressionString = getExprString(ctx.condition);
-            conditionExpression = getExpressionTerm(conditionExpressionString);
+            conditionExpression = getExpressionTerm(ctx.condition);
         }
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultOptionalField(null, type, name, conditionExpression, params);
+        Field field = new DefaultOptionalField(getAttributes(ctx), type, name, conditionExpression, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -299,13 +325,11 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterPaddingField(MSpecParser.PaddingFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        String paddingValueString = getExprString(ctx.paddingValue);
-        Term paddingValue = getExpressionTerm(paddingValueString);
-        String paddingConditionString = getExprString(ctx.paddingCondition);
-        Term paddingCondition = getExpressionTerm(paddingConditionString);
+        Term paddingValue = getExpressionTerm(ctx.paddingValue);
+        Term paddingCondition = getExpressionTerm(ctx.paddingCondition);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultPaddingField(null, type, name, paddingValue, paddingCondition, params);
+        Field field = new DefaultPaddingField(getAttributes(ctx), type, name, paddingValue, paddingCondition, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -315,7 +339,7 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterReservedField(MSpecParser.ReservedFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String expected = getExprString(ctx.expected);
-        Field field = new DefaultReservedField(null, type, expected);
+        Field field = new DefaultReservedField(getAttributes(ctx), type, expected);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -327,7 +351,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String name = getIdString(ctx.name);
         MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
         List<Term> params = getFieldParams(fieldDefinitionContext);
-        Field field = new DefaultSimpleField(null, type, name, params);
+        Field field = new DefaultSimpleField(getAttributes(ctx), type, name, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -336,10 +360,9 @@ public class MessageFormatListener extends MSpecBaseListener {
     @Override
     public void enterTypeSwitchField(MSpecParser.TypeSwitchFieldContext ctx) {
         List<Term> discriminatorExpressions = ctx.discriminators.expression().stream()
-            .map(this::getExprString)
             .map(this::getExpressionTerm)
             .collect(Collectors.toList());
-        DefaultSwitchField field = new DefaultSwitchField(false, discriminatorExpressions);
+        DefaultSwitchField field = new DefaultSwitchField(discriminatorExpressions);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -348,7 +371,7 @@ public class MessageFormatListener extends MSpecBaseListener {
     @Override
     public void enterUnknownField(MSpecParser.UnknownFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
-        Field field = new DefaultUnknownField(null, type);
+        Field field = new DefaultUnknownField(getAttributes(ctx), type);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -358,9 +381,8 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterVirtualField(MSpecParser.VirtualFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = getIdString(ctx.name);
-        String valueExpressionString = getExprString(ctx.valueExpression);
-        Term valueExpression = getExpressionTerm(valueExpressionString);
-        Field field = new DefaultVirtualField(null, type, name, valueExpression);
+        Term valueExpression = getExpressionTerm(ctx.valueExpression);
+        Field field = new DefaultVirtualField(getAttributes(ctx), type, name, valueExpression);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -375,6 +397,9 @@ public class MessageFormatListener extends MSpecBaseListener {
     @Override
     public void exitCaseStatement(MSpecParser.CaseStatementContext ctx) {
         String typeName = ctx.name.getText();
+
+        final Map<String, Term> attributes = batchSetAttributes.peek();
+
         List<Argument> parserArguments = new LinkedList<>();
         // For DataIO types, add all the arguments from the parent type.
         if (!(ctx.parent.parent.parent.parent instanceof MSpecParser.ComplexTypeContext)
@@ -396,7 +421,7 @@ public class MessageFormatListener extends MSpecBaseListener {
             discriminatorValues = Collections.emptyList();
         }
         DefaultDiscriminatedComplexTypeDefinition type =
-            new DefaultDiscriminatedComplexTypeDefinition(typeName, parserArguments, null,
+            new DefaultDiscriminatedComplexTypeDefinition(typeName, attributes, parserArguments,
                 discriminatorValues, parserContexts.pop());
 
         // Add the type to the switch field definition.
@@ -455,13 +480,15 @@ public class MessageFormatListener extends MSpecBaseListener {
         enumValues.add(enumValue);
     }
 
-    private Term getExpressionTerm(String expressionString) {
+    private Term getExpressionTerm(MSpecParser.ExpressionContext expressionContext) {
+        String expressionString = getExprString(expressionContext);
         InputStream inputStream = IOUtils.toInputStream(expressionString, Charset.defaultCharset());
         ExpressionStringParser parser = new ExpressionStringParser();
         try {
             return parser.parse(inputStream);
         } catch (Exception e) {
-            throw new RuntimeException("Error parsing expression: '" + expressionString + "'", e);
+            throw new RuntimeException(String.format("Error parsing expression: '%s' at line %d column %d",
+                expressionString, expressionContext.start.getLine(), expressionContext.start.getStartIndex()), e);
         }
     }
 
@@ -481,7 +508,7 @@ public class MessageFormatListener extends MSpecBaseListener {
             (simpleBaseType == SimpleTypeReference.SimpleBaseType.VSTRING)) {
             if (simpleBaseType == SimpleTypeReference.SimpleBaseType.VSTRING) {
                 if(ctx.length != null) {
-                    Term lengthExpression = getExpressionTerm(ctx.length.getText().substring(1, ctx.length.getText().length() - 1));
+                    Term lengthExpression = getExpressionTerm(ctx.length);
                     return new DefaultStringTypeReference(simpleBaseType, lengthExpression, "UTF-8");
                 } else {
                     return new DefaultStringTypeReference(simpleBaseType, null, "UTF-8");
@@ -553,12 +580,30 @@ public class MessageFormatListener extends MSpecBaseListener {
         InputStream inputStream = IOUtils.toInputStream(expressionString, Charset.defaultCharset());
         ExpressionStringParser parser = new ExpressionStringParser();
         try {
-            return parser.parse(inputStream);
+            Term term = parser.parse(inputStream);
+            return term;
         } catch (Exception e) {
             throw new RuntimeException("Error parsing expression: '" + expressionString + "'", e);
         }
     }
 
+    private Map<String, Term> getAttributes(RuleContext ctx) {
+        Map<String, Term> attributes = new HashMap<>();
+        // Add any attributes from the current batchSet context.
+        if (!batchSetAttributes.empty()) {
+            attributes.putAll(batchSetAttributes.peek());
+        }
+        // Add any attributes set on the current field itself.
+        if(ctx.parent.parent instanceof MSpecParser.FieldDefinitionContext) {
+            MSpecParser.FieldDefinitionContext fieldDefinitionContext = (MSpecParser.FieldDefinitionContext) ctx.parent.parent;
+            for (MSpecParser.AttributeContext attributeContext : fieldDefinitionContext.attributes.attribute()) {
+                Term attributeExpression = getExpressionTerm(attributeContext.value);
+                attributes.put(attributeContext.name.getText(), attributeExpression);
+            }
+        }
+        return attributes;
+    }
+
     private String unquoteString(String quotedString) {
         if (quotedString != null && quotedString.length() >= 2) {
             return quotedString.substring(1, quotedString.length() - 1);
diff --git a/protocols/ab-eth/src/main/resources/protocols/abeth/ab-eth.mspec b/protocols/ab-eth/src/main/resources/protocols/abeth/ab-eth.mspec
index d156b75..5e43428 100644
--- a/protocols/ab-eth/src/main/resources/protocols/abeth/ab-eth.mspec
+++ b/protocols/ab-eth/src/main/resources/protocols/abeth/ab-eth.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[discriminatedType 'CIPEncapsulationPacket'
+[discriminatedType 'CIPEncapsulationPacket' byteOrder='"BIG_ENDIAN"'
     [discriminator uint 16 'commandType']
     [implicit      uint 16 'len' 'lengthInBytes - 28']
     [simple        uint 32 'sessionHandle']
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
index 50d4b04..d8a6f15 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
@@ -21,17 +21,7 @@
 // AMS/TCP Packet
 ////////////////////////////////////////////////////////////////
 
-[enum uint 8 'Operation'
-    ['0x01' DISCOVERY]
-    ['0x06' ROUTE    ]
-]
-
-[enum uint 8 'Direction'
-    ['0x00' REQUEST ]
-    ['0x80' RESPONSE]
-]
-
-[discriminatedType 'AdsDiscovery'
+[discriminatedType 'AdsDiscovery' byteOrder='"BIG_ENDIAN"'
     [const uint 32 'header' '0x03661471L']
     [reserved   uint 32  '0x00000000L']
     [enum Operation 'operation']
@@ -79,6 +69,16 @@
     ]
 ]
 
+[enum uint 8 'Operation'
+    ['0x01' DISCOVERY]
+    ['0x06' ROUTE    ]
+]
+
+[enum uint 8 'Direction'
+    ['0x00' REQUEST ]
+    ['0x80' RESPONSE]
+]
+
 [enum uint 24 'RouteStatus'
     ['0x040000' SUCCESS]
     ['0x000407' FAILURE]
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index e72c6cf..b62fb90 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -21,7 +21,7 @@
 // AMS/TCP Packet
 ////////////////////////////////////////////////////////////////
 
-[type 'AmsTCPPacket'
+[type 'AmsTCPPacket' byteOrder='"LITTLE_ENDIAN"'
     // AMS/TCP Header	6 bytes	contains the tcpLength of the data packet.
     // These bytes must be set to 0.
     [reserved   uint       16       '0x0000'                            ]
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index d88eadc..aac3cbe 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[discriminatedType 'BVLC'
+[discriminatedType 'BVLC' byteOrder='"BIG_ENDIAN"'
     [const         uint 8  'bacnetType'   '0x81'       ]
     [discriminator uint 8  'bvlcFunction'              ]
     [implicit      uint 16 'bvlcLength' 'lengthInBytes']
diff --git a/protocols/canopen/src/main/resources/protocols/can/canopen.mspec b/protocols/canopen/src/main/resources/protocols/can/canopen.mspec
index 07b52f2..b613ad5 100644
--- a/protocols/canopen/src/main/resources/protocols/can/canopen.mspec
+++ b/protocols/canopen/src/main/resources/protocols/can/canopen.mspec
@@ -354,7 +354,7 @@
 ]
 
 // A compact, byte aligned structure for test and embedding purposes
-[type 'CANOpenFrame'
+[type 'CANOpenFrame' byteOrder='"LITTLE_ENDIAN"'
     [simple uint 8 'nodeId']
     [simple CANOpenService 'service']
     [const uint 4 'alignment' '0x00']
diff --git a/protocols/df1/src/main/resources/protocols/df1/df1.mspec b/protocols/df1/src/main/resources/protocols/df1/df1.mspec
index 644c4fe..7cdbbaa 100644
--- a/protocols/df1/src/main/resources/protocols/df1/df1.mspec
+++ b/protocols/df1/src/main/resources/protocols/df1/df1.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[discriminatedType 'DF1Symbol'
+[discriminatedType 'DF1Symbol' byteOrder='"BIG_ENDIAN"'
     [const            uint 8       'messageStart' '0x10']
     [discriminator    uint 8       'symbolType']
     [typeSwitch 'symbolType'
diff --git a/protocols/eip/src/main/resources/protocols/eip/eip.mspec b/protocols/eip/src/main/resources/protocols/eip/eip.mspec
index 5e10014..92bcb90 100644
--- a/protocols/eip/src/main/resources/protocols/eip/eip.mspec
+++ b/protocols/eip/src/main/resources/protocols/eip/eip.mspec
@@ -21,7 +21,7 @@
 ///EthernetIP Header of size 24
 /////////////////////////////////////////////////////////////////
 
-[discriminatedType 'EipPacket'
+[discriminatedType 'EipPacket' byteOrder='"BIG_ENDIAN"'
     [discriminator uint 16 'command']
     [implicit      uint 16 'len' 'lengthInBytes - 24']
     [simple        uint 32 'sessionHandle']
diff --git a/protocols/firmata/src/main/resources/protocols/firmata/firmata.mspec b/protocols/firmata/src/main/resources/protocols/firmata/firmata.mspec
index a42f6dc..d20d3f4 100644
--- a/protocols/firmata/src/main/resources/protocols/firmata/firmata.mspec
+++ b/protocols/firmata/src/main/resources/protocols/firmata/firmata.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[discriminatedType 'FirmataMessage' [bit 'response']
+[discriminatedType 'FirmataMessage' byteOrder='"BIG_ENDIAN"' [bit 'response']
     [discriminator uint 4 'messageType']
     [typeSwitch 'messageType'
         // Reading operations
diff --git a/protocols/genericcan/src/main/resources/protocols/can/genericcan.mspec b/protocols/genericcan/src/main/resources/protocols/can/genericcan.mspec
index 757f8dc..26f491f 100644
--- a/protocols/genericcan/src/main/resources/protocols/can/genericcan.mspec
+++ b/protocols/genericcan/src/main/resources/protocols/can/genericcan.mspec
@@ -40,7 +40,7 @@
     [REAL64      ['64'] ]
 ]
 
-[dataIo 'DataItem' [GenericCANDataType 'dataType']
+[dataIo 'DataItem' byteOrder='"LITTLE_ENDIAN"' [GenericCANDataType 'dataType']
     [typeSwitch 'dataType'
         ['BYTE' BYTE
             [simple byte 'value']
diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index 8f9f895..3788de8 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[discriminatedType 'KnxNetIpMessage'
+[discriminatedType 'KnxNetIpMessage' byteOrder='"BIG_ENDIAN"'
     [implicit      uint 8  'headerLength'    '6']
     [const         uint 8  'protocolVersion' '0x10']
     [discriminator uint 16 'msgType']
diff --git a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
index 844e007..8f29eec 100644
--- a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
+++ b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
@@ -23,7 +23,7 @@
     [const          uint 16     'modbusTcpDefaultPort' '502']
 ]
 
-[type 'ModbusTcpADU' [bit 'response']
+[type 'ModbusTcpADU' byteOrder='"BIG_ENDIAN"' [bit 'response']
     // It is used for transaction pairing, the MODBUS server copies in the response the transaction
     // identifier of the request.
     [simple         uint 16     'transactionIdentifier']
@@ -45,7 +45,7 @@
     [simple         ModbusPDU   'pdu' ['response']]
 ]
 
-[type 'ModbusSerialADU' [bit 'response']
+[type 'ModbusSerialADU' byteOrder='"LITTLE_ENDIAN"' [bit 'response']
     [simple         uint 16     'transactionId']
     [reserved       uint 16     '0x0000']
     [simple         uint 16     'length']
diff --git a/protocols/opcua/src/main/xslt/opc-manual.xsl b/protocols/opcua/src/main/xslt/opc-manual.xsl
index b8ebdc1..4b2265c 100644
--- a/protocols/opcua/src/main/xslt/opc-manual.xsl
+++ b/protocols/opcua/src/main/xslt/opc-manual.xsl
@@ -55,7 +55,7 @@
     <xsl:template match="/">
 // Remark: The different fields are encoded in Little-endian.
 
-[type 'OpcuaAPU' [bit 'response']
+[type 'OpcuaAPU' byteOrder='"LITTLE_ENDIAN"' [bit 'response']
     [simple         MessagePDU   'message' ['response']]
 ]
 
diff --git a/protocols/plc4x/src/main/resources/protocols/plc4x/plc4x.mspec b/protocols/plc4x/src/main/resources/protocols/plc4x/plc4x.mspec
index 285a883..c9b7111 100644
--- a/protocols/plc4x/src/main/resources/protocols/plc4x/plc4x.mspec
+++ b/protocols/plc4x/src/main/resources/protocols/plc4x/plc4x.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[discriminatedType 'Request'
+[discriminatedType 'Request' byteOrder='"BIG_ENDIAN"'
     // TODO: Replace this with an discriminator field asap
     [simple RequestType 'type']
     [typeSwitch 'type'
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
index 2a9186a..d4f49ea 100644
--- a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
+++ b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
@@ -37,7 +37,7 @@
  PnPtcp     PROFINET Precision Transparent Clock Protocol
 */
 
-[type 'Ethernet_Frame'
+[type 'Ethernet_Frame' byteOrder='"BIG_ENDIAN"'
     // When sending to the mac address prefix of 01:0e:cf are multicast packets
     [simple MacAddress            'destination']
     [simple MacAddress            'source'     ]
@@ -92,7 +92,7 @@
 // usually be dynamic. However are we trying to limit the number of
 // arguments needed to construct the messages and Profinet only seems
 // be using a very limited subset of all possible DCE/RPC packets.
-[type 'DceRpc_Packet'
+[type 'DceRpc_Packet' byteOrder='"BIG_ENDIAN"'
 // RPC Header {
     // RPCVersion 4.10.3.2.1
     [const         uint 8                'version'                        '0x04'                 ]
@@ -118,7 +118,7 @@
     [simple        FloatingPointEncoding 'floatingPointEncoding'                                 ]
     // RPCSerialHigh 4.10.3.2.6
     [const         uint 8                'serialHigh'                     '0x00'                 ]
-    [batchSet encoding='integerEncoding ? "BIG_ENDIAN" : "LITTLE_ENDIAN"'
+    [batchSet byteOrder='integerEncoding ? "BIG_ENDIAN" : "LITTLE_ENDIAN"'
         // RPCObjectUUID 4.10.3.2.8
         [simple DceRpc_ObjectUuid        'objectUuid'                                            ]
         // RPCInterfaceUUID 4.10.3.2.9
@@ -148,20 +148,20 @@
     [const            uint 8             'serialLow'                      '0x00'                 ]
 // RPC Header }
 // RPC Payload {
-    [simple PnIoCm_Packet 'payload' encoding='integerEncoding ? "BIG_ENDIAN" : "LITTLE_ENDIAN"' ['packetType'] ]
+    [simple PnIoCm_Packet 'payload' byteOrder='integerEncoding ? "BIG_ENDIAN" : "LITTLE_ENDIAN"' ['packetType'] ]
 // RPC Payload }
 ]
 
 // RPCObjectUUID 4.10.3.2.8
 [type 'DceRpc_ObjectUuid'
-    [const  uint 32 'data1'      '0xDEA00000'                      ]
-    [const  uint 16 'data2'      '0x6C97'                          ]
-    [const  uint 16 'data3'      '0x11D1'                          ]
+    [const  uint 32 'data1'      '0xDEA00000'                         ]
+    [const  uint 16 'data2'      '0x6C97'                             ]
+    [const  uint 16 'data3'      '0x11D1'                             ]
     // This part is described as a byte array, so the byte order is always big-endian
-    [const  uint 16 'data4'      '0x8271'     encoding='BIG_ENDIAN']
-    [simple uint 16 'nodeNumber'              encoding='BIG_ENDIAN']
-    [simple uint 16 'deviceId'                encoding='BIG_ENDIAN']
-    [simple uint 16 'vendorId'                encoding='BIG_ENDIAN']
+    [const  uint 16 'data4'      '0x8271'     byteOrder='"BIG_ENDIAN"']
+    [simple uint 16 'nodeNumber'              byteOrder='"BIG_ENDIAN"']
+    [simple uint 16 'deviceId'                byteOrder='"BIG_ENDIAN"']
+    [simple uint 16 'vendorId'                byteOrder='"BIG_ENDIAN"']
 ]
 
 // RPCInterfaceUUID 4.10.3.2.9
@@ -170,14 +170,14 @@
 //       dynamically endianed and the last 8 bytes are set to Big Endian, we
 //       had to do this trick.
 [discriminatedType 'DceRpc_InterfaceUuid'
-    [discriminator  uint 32 'interfaceType'                                ]
-    [const          uint 16 'data1'      '0x6C97'                          ]
-    [const          uint 16 'data2'      '0x11D1'                          ]
+    [discriminator  uint 32 'interfaceType'                                   ]
+    [const          uint 16 'data1'      '0x6C97'                             ]
+    [const          uint 16 'data2'      '0x11D1'                             ]
     // This part is described as a byte array, so the byte order is always big-endian
-    [const          uint 16 'data3'      '0x8271'     encoding='BIG_ENDIAN']
-    [const          uint 16 'data4'      '0x00A0'     encoding='BIG_ENDIAN']
-    [const          uint 16 'data5'      '0x2442'     encoding='BIG_ENDIAN']
-    [const          uint 16 'data6'      '0xDF7D'     encoding='BIG_ENDIAN']
+    [const          uint 16 'data3'      '0x8271'     byteOrder='"BIG_ENDIAN"']
+    [const          uint 16 'data4'      '0x00A0'     byteOrder='"BIG_ENDIAN"']
+    [const          uint 16 'data5'      '0x2442'     byteOrder='"BIG_ENDIAN"']
+    [const          uint 16 'data6'      '0xDF7D'     byteOrder='"BIG_ENDIAN"']
     [typeSwitch 'interfaceType'
         ['0xDEA00001' DceRpc_InterfaceUuid_DeviceInterface
         ]
@@ -196,11 +196,11 @@
 //       the first parts are effected by endianess, and the last 8
 //       bytes are fixed big-endian. Therefore the complicated notation.
 [type 'DceRpc_ActivityUuid'
-    [simple  uint 32 'data1'                      ]
-    [simple  uint 16 'data2'                      ]
-    [simple  uint 16 'data3'                      ]
+    [simple  uint 32 'data1'                         ]
+    [simple  uint 16 'data2'                         ]
+    [simple  uint 16 'data3'                         ]
     // This part is described as a byte array, so the byte order is always big-endian
-    [simple  uint 64 'data4' encoding='BIG_ENDIAN']
+    [simple  uint 64 'data4' byteOrder='"BIG_ENDIAN"']
 ]
 
 // There are some special MAC addresses reserved:
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index fb01c18..af96a7e 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -21,7 +21,7 @@
 // IsoOnTcp/TPKT
 ////////////////////////////////////////////////////////////////
 
-[type 'TPKTPacket'
+[type 'TPKTPacket' byteOrder='"BIG_ENDIAN"'
     [const    uint 8     'protocolId' '0x03']
     [reserved uint 8     '0x00']
     [implicit uint 16    'len'        'payload.lengthInBytes + 4']
diff --git a/protocols/simulated/src/main/resources/protocols/simulated/simulated.mspec b/protocols/simulated/src/main/resources/protocols/simulated/simulated.mspec
index d31fbf6..a5d5bb5 100644
--- a/protocols/simulated/src/main/resources/protocols/simulated/simulated.mspec
+++ b/protocols/simulated/src/main/resources/protocols/simulated/simulated.mspec
@@ -19,7 +19,7 @@
 
 // Remark: The different fields are encoded in Big-endian.
 
-[type   'Dummy'
+[type   'Dummy' byteOrder='"BIG_ENDIAN"'
     [simple uint        16  'dummy']
 ]
 
diff --git a/protocols/socketcan/src/main/resources/protocols/can/socketcan.mspec b/protocols/socketcan/src/main/resources/protocols/can/socketcan.mspec
index 7350d14..be266e1 100644
--- a/protocols/socketcan/src/main/resources/protocols/can/socketcan.mspec
+++ b/protocols/socketcan/src/main/resources/protocols/can/socketcan.mspec
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-[type 'SocketCANFrame'
+[type 'SocketCANFrame' byteOrder='"LITTLE_ENDIAN"'
     [simple int 32 'rawId']
     [virtual int 32 'identifier'
         'STATIC_CALL("org.apache.plc4x.java.transport.socketcan.helper.HeaderParser.readIdentifier", rawId)'