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 2019/05/20 11:20:10 UTC
[plc4x] 04/04: - Adjusted, parser,
grammar and spec to now provide a full working example of an ANTLR4
based parser for the imaginary spec language.
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/code-gen
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 73ca94a38d909e5045fb40b15d4989e8bd7b8ef8
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon May 20 13:19:56 2019 +0200
- Adjusted, parser, grammar and spec to now provide a full working example of an ANTLR4 based parser for the imaginary spec language.
---
.../codegenerator/parser/imaginary/Imaginary.g4 | 19 +++-
.../codegenerator/model/fields/SwitchField.java | 10 +-
.../parser/MessageFormatListener.java | 8 +-
.../src/test/resources/specs/s7.spec | 110 ++++++++++-----------
4 files changed, 79 insertions(+), 68 deletions(-)
diff --git a/sandbox/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4 b/sandbox/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4
index 84368c1..23ecaca 100644
--- a/sandbox/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4
+++ b/sandbox/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4
@@ -11,12 +11,12 @@ complexTypeDefinition
complexType
: K_TYPE name=idExpression fieldDefinition+
- | K_DISCRIMINATED_TYPE name=idExpression length='[length]'? fieldDefinition+
+ | K_DISCRIMINATED_TYPE name=idExpression (LBRACKET params=multipleExpressions RBRACKET)? fieldDefinition+
;
fieldDefinition
- : LBRACKET field RBRACKET
+ : LBRACKET field (LCBRACKET context RCBRACKET)? RBRACKET
;
field
@@ -53,7 +53,7 @@ embeddedField
;
simpleField
- : K_FIELD type=dataType name=idExpression
+ : K_FIELD type=typeReference name=idExpression (LCBRACKET context RCBRACKET)?
;
implicitField
@@ -69,7 +69,7 @@ reservedField
;
typeSwitchField
- : K_TYPE_SWITCH discriminator=idExpression caseStatement*
+ : K_TYPE_SWITCH discriminators=multipleExpressions caseStatement*
;
@@ -79,14 +79,16 @@ typeReference
;
caseStatement
- : LBRACKET discriminatorValues=multipleExpressions name=IDENTIFIER fieldDefinition+ RBRACKET
+ : LBRACKET discriminatorValues=multipleExpressions name=IDENTIFIER fieldDefinition* RBRACKET
;
dataType
: 'bit'
+ | K_UINT5
| 'uint7'
| K_UINT8
| K_UINT16
+ | K_STRING
;
expression
@@ -163,8 +165,10 @@ K_TYPE_SWITCH : 'typeSwitch';
K_COUNT : 'count';
K_LENGTH : 'length';
+K_UINT5 : 'uint5';
K_UINT8 : 'uint8';
K_UINT16 : 'uint16';
+K_STRING: 'string';
TICK : '\'';
TIMES : 'x';
@@ -177,6 +181,11 @@ BinaryOperator
: '+'
| '-'
| '=='
+ | '!='
+ | '>'
+ | '<'
+ | '>='
+ | '<='
;
ZERO : '0';
diff --git a/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/SwitchField.java b/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/SwitchField.java
index 78703b1..9b2afac 100644
--- a/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/SwitchField.java
+++ b/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/SwitchField.java
@@ -26,16 +26,16 @@ import java.util.List;
public class SwitchField implements Field {
- private final String discriminatorName;
+ private final String[] discriminatorNames;
private final List<DiscriminatedComplexType> cases;
- public SwitchField(String discriminatorName) {
- this.discriminatorName = discriminatorName;
+ public SwitchField(String[] discriminatorNames) {
+ this.discriminatorNames = discriminatorNames;
cases = new LinkedList<>();
}
- public String getDiscriminatorName() {
- return discriminatorName;
+ public String[] getDiscriminatorNames() {
+ return discriminatorNames;
}
public void addCase(DiscriminatedComplexType caseType) {
diff --git a/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java b/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java
index a98aa91..1c58911 100644
--- a/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java
+++ b/sandbox/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java
@@ -136,8 +136,12 @@ public class MessageFormatListener extends ImaginaryBaseListener {
@Override
public void enterTypeSwitchField(ImaginaryParser.TypeSwitchFieldContext ctx) {
- String discriminator = ctx.discriminator.getText();
- SwitchField switchField = new SwitchField(discriminator);
+ int numDescriminators = ctx.discriminators.expression().size();
+ String[] discriminators = new String[numDescriminators];
+ for(int i = 0; i < numDescriminators; i++) {
+ discriminators[i] = ctx.discriminators.expression().get(i).getText();
+ }
+ SwitchField switchField = new SwitchField(discriminators);
parserContexts.peek().add(switchField);
}
diff --git a/sandbox/plc4x-maven-plugin/src/test/resources/specs/s7.spec b/sandbox/plc4x-maven-plugin/src/test/resources/specs/s7.spec
index 84356dc..f46d8a9 100644
--- a/sandbox/plc4x-maven-plugin/src/test/resources/specs/s7.spec
+++ b/sandbox/plc4x-maven-plugin/src/test/resources/specs/s7.spec
@@ -2,18 +2,18 @@
// IsoOnTcp/TPKT
////////////////////////////////////////////////////////////////
-[type TPKTPacket
- [const uint8 'protocolId' '0x3']
- [reserved uint8 '0x0']
- [implicit uint16 'length' 'payload.size + 4']
- [embedded 'payload' {length: 'length - 4'}]
+[type 'TPKTPacket'
+ [const uint8 'protocolId' '0x3']
+ [reserved uint8 '0x0']
+ [implicit uint16 'len' 'payload.size + 4']
+ [field COTPPacket 'payload' {payloadLength: 'len - 4'}]
]
////////////////////////////////////////////////////////////////
// COTP
////////////////////////////////////////////////////////////////
-[discriminatedType COTPPacket [length]
+[discriminatedType 'COTPPacket' ['payloadLength']
[implicit uint8 'headerLength' 'this.size - (payload.size + 1)']
[discriminator uint8 'tpduCode']
[typeSwitch 'tpduCode'
@@ -46,12 +46,12 @@
]
]
[arrayField COTPParameter 'parameters' length '(headerLength + 1) - cur']
- [embedded 'payload' {length: 'length - (headerLength + 1)'}]
+ [field S7Message 'payload' {payloadLength: 'payloadLength - (headerLength + 1)'}]
]
-[discriminatedType COTPParameter
- [discriminator uint8 'type']
- [typeSwitch 'type'
+[discriminatedType 'COTPParameter'
+ [discriminator uint8 'parameterType']
+ [typeSwitch 'parameterType'
['0xC0' TpduSize
[field uint8 'tpduSize']
]
@@ -74,36 +74,36 @@
// S7
////////////////////////////////////////////////////////////////
-[discriminatedType S7Message
+[discriminatedType 'S7Message' ['payloadLength']
[const uint8 'protocolId' '0x32']
- [discriminator uint8 'type']
+ [discriminator uint8 'messageType']
[reserved uint16 '0x00']
[field uint16 'tpduReference']
[implicit uint16 'parameterLength' 'parameter.size']
[implicit uint16 'payloadLength' 'payload.size']
- [typeSwitch 'type'
+ [typeSwitch 'messageType'
['0x01' Request
- [context 'messageType' 'request']
+ [context string 'messageType' 'request']
]
['0x03' Response
- [context 'messageType' 'response']
+ [context string 'messageType' 'response']
[field uint8 'errorClass']
[field uint8 'errorCode']
]
['0x07' UserData
- [context 'messageType' 'userData']
+ [context string 'messageType' 'userData']
]
]
- [optionalField S7Parameter 'parameter' 'parameterLength > 0' {messageType: messageType}]
- [optionalField S7Payload 'payload' 'payloadLength > 0' {messageType: messageType, parameter: parameter}]
+ [optionalField S7Parameter 'parameter' 'parameterLength > 0' {messageType: 'messageType'}]
+ [optionalField S7Payload 'payload' 'payloadLength > 0' {messageType: 'messageType', parameter: 'parameter'}]
]
////////////////////////////////////////////////////////////////
// Parameters
-[discriminatedType S7Parameter [messageType]
- [discriminator uint8 'type']
- [typeSwitch 'type,messageType'
+[discriminatedType 'S7Parameter' ['messageType']
+ [discriminator uint8 'parameterType']
+ [typeSwitch 'parameterType','messageType'
['0xF0' SetupCommunication
[reserved uint8 '0x0']
[field uint16 'maxAmqCaller']
@@ -111,29 +111,29 @@
[field uint16 'pduLength']
]
['0x04','request' ReadVarRequest
- [implicit uint8 'numItems' 'items.count']
+ [implicit uint8 'numItems' 'items.size']
[arrayField S7VarRequestParameterItem 'items' count 'numItems']
]
['0x04','response' ReadVarResponse
[field uint8 'numItems']
]
['0x05','request' WriteVarRequest
- [implicit uint8 'numItems' 'items.count']
+ [implicit uint8 'numItems' 'items.size']
[arrayField S7VarRequestParameterItem 'items' count 'numItems']
]
['0x05','response' WriteVarResponse
[field uint8 'numItems']
]
['0x00','userData' UserData
- [implicit uint8 'items.count']
+ [implicit uint8 'numItems' 'items.size']
[arrayField UserDataItem 'items' count 'numItems']
]
]
]
-[discriminatedType S7VarRequestParameterItem
- [discriminator uint8 'type']
- [typeSwitch 'type'
+[discriminatedType 'S7VarRequestParameterItem'
+ [discriminator uint8 'parameterItemType']
+ [typeSwitch 'parameterItemType'
['0x12' Address
[implicit uint8 'addressLength' 'address.size']
[field S7Address 'address']
@@ -141,35 +141,33 @@
]
]
-[discriminatedType S7Address
- [discriminator uint8 'type']
- [typeSwitch 'type'
+[discriminatedType 'S7Address'
+ [discriminator uint8 'addressType']
+ [typeSwitch 'addressType'
['0x10' Any
- [field uint8 'transportSize']
- [field uint16 'length']
- [field uint8 'dbNumber']
- [field uint8 'area']
- [reserved uint5]
- [field uint16 'byteAddress']
- [field uint3 'bitAddress']
+ [field uint8 'transportSize']
+ [field uint16 'numberOfElements']
+ [field uint8 'dbNumber']
+ [field uint8 'area']
+ [reserved uint5 '0x0']
+ [field uint16 'byteAddress']
+ [field uint3 'bitAddress']
]
]
]
-[discriminatorType UserDataItem
- [discriminator uint8 'type']
- [typeSwitch type
+// TODO: CPUFunctions still need some love ...
+[discriminatedType 'UserDataItem'
+ [discriminator uint8 'itemType']
+ [typeSwitch 'itemType'
['0x12' CPUFunctions
- [internal uint8 'parameterLength']
- [field uint16 'type']
- [field unit8 'subFunctionGroup']
- [field uint8 'sequenceNumber']
- [optionalField uint8 'dataUnitReferenceNumber' 'parameterLength == 8']
- [optionalField uint8 'lastDataUnit' 'parameterLength == 8']
- [optionalField uint8 'errorCode' 'parameterLength == 8']
-
- // TODO: CPUFunctions still need some love ...
-
+ [implicit uint8 'parameterLength' 'size']
+ [field uint16 'cpuFunctionType']
+ [field unit8 'subFunctionGroup']
+ [field uint8 'sequenceNumber']
+ [optionalField uint8 'dataUnitReferenceNumber' 'parameterLength == 8']
+ [optionalField uint8 'lastDataUnit' 'parameterLength == 8']
+ [optionalField uint8 'errorCode' 'parameterLength == 8']
]
]
]
@@ -177,8 +175,8 @@
////////////////////////////////////////////////////////////////
// Payloads
-[discriminatorType S7Payload [messageType, parameter]
- [typeSwitch 'parameter.type, messageType'
+[discriminatedType 'S7Payload' ['messageType', 'parameter']
+ [typeSwitch 'parameter.parameterType', 'messageType'
['0x04','response' ReadVarResponse
[arrayField S7VarPayloadDataItem 'items' count 'parameter.numItems']
]
@@ -193,13 +191,13 @@
]
]
-[type S7VarPayloadDataItem
+[type 'S7VarPayloadDataItem'
[field uint8 'returnCode']
[field uint8 'transportSize']
- [field uint16 'length']
- [arrayField uint8 'data' count 'length']
+ [field uint16 'dataLength']
+ [arrayField uint8 'data' count 'dataLength']
]
-[type S7VarPayloadStatusItem
+[type 'S7VarPayloadStatusItem'
[field uint8 'returnCode']
]
\ No newline at end of file