|
|
|
|
|
|
|
|
|
|
|
|
|
Re: Reference from xxxx will not be updated as the language has not registered an IReferenceUpdater [message #1862798 is a reply to message #1862797] |
Fri, 29 December 2023 09:42   |
Eclipse User |
|
|
|
This is my GenerateGLVDsl.mwe2 :
module com.abcd.glv.dsl.GenerateGLVDsl
import org.eclipse.emf.mwe.utils.*
import org.eclipse.xtext.xtext.generator.*
import org.eclipse.xtext.xtext.generator.model.project.*
var rootPath = ".."
Workflow {
bean = StandaloneSetup {
scanClassPath = true
platformUri = rootPath
registerGenModelFile = "platform:/resource/com.abcd.udt.dsl/model/generated/UDTdsl.genmodel"
}
component = XtextGenerator {
configuration = {
project = StandardProjectConfig {
baseName = "com.abcd.glv.dsl"
rootPath = rootPath
runtimeTest = {
enabled = true
}
eclipsePlugin = {
enabled = true
}
eclipsePluginTest = {
enabled = true
}
createEclipseMetaData = true
}
code = {
encoding = "UTF-8"
lineDelimiter = "\r\n"
fileHeader = "/*\n * generated by Xtext \${version}\n */"
preferXtendStubs = false
}
}
language = StandardLanguage {
name = "com.abcd.glv.dsl.GLVDsl"
fileExtensions = "global"
referencedResource = "platform:/resource/com.abcd.udt.dsl/model/generated/UDTdsl.genmodel"
serializer = {
generateStub = false
}
validator = {
// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
// Generates checks for @Deprecated grammar annotations, an IssueProvider and a corresponding PropertyPage
generateDeprecationValidation = true
}
generator = {
generateXtendStub = true
}
junitSupport = {
junitVersion = "5"
}
}
}
}
GenerateUDTdsl.mwe2 file
module com.abcd.udt.GenerateUDTdsl
import org.eclipse.xtext.xtext.generator.*
import org.eclipse.xtext.xtext.generator.model.project.*
var rootPath = ".."
Workflow {
component = XtextGenerator {
configuration = {
project = StandardProjectConfig {
baseName = "com.abcd.udt.dsl"
rootPath = rootPath
runtimeTest = {
enabled = true
}
eclipsePlugin = {
enabled = true
}
eclipsePluginTest = {
enabled = true
}
createEclipseMetaData = true
}
code = {
encoding = "UTF-8"
lineDelimiter = "\r\n"
fileHeader = "/*\n * generated by Xtext \${version}\n */"
preferXtendStubs = false
}
}
language = StandardLanguage {
name = "com.abcd.udt.UDTdsl"
fileExtensions = "udt"
formatter={
generateStub=true
generateXtendStub=true
}
serializer = {
generateStub = false
}
validator = {
// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
// Generates checks for @Deprecated grammar annotations, an IssueProvider and a corresponding PropertyPage
generateDeprecationValidation = true
}
generator = {
generateXtendStub = true
}
junitSupport = {
junitVersion = "5"
}
}
}
}
UDT.xtext
grammar com.abcd.udt.UDTdsl hidden(WS, ML_COMMENT, SL_COMMENT)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate uDTdsl "http://www.xxxxx.com/ide/plc/UDTdsl"
UDT_TYPE_DEF_LIST:
list+=UDT_CUSTOM_TYPE_DEF+
;
UDT_CUSTOM_TYPE_DEF:
{UDT_CUSTOM_TYPE_DEF} 'TYPE'
type_def+=UDT_TYPE_DEF*
'END_TYPE';
UDT_TYPE_DEF:
UDT_ARRAY_TYPE_DEF | UDT_SUB_SET_TYPE_DEF | UDT_ENUM_TYPE_DEF | UDT_DIRECT_TYPE_DEF | UDT_STRUCT_TYPE_DEF;
UDT_ARRAY_TYPE_DEF:
name=ID ':' arrayExp = UDT_ARRAY_EXP end=SEMICOLON;
UDT_ARRAY_EXP:
'ARRAY' '[' value1=subrange_type (',' value2=subrange_type)? ']' 'OF' (pointer_to?=UDT_POINTER_TO)?
(type=UDT_BASIC_TYPE | userDefinedTypeName=ID) (initValue=UDT_VAR_INIT_VALUE)?
;
UDT_ARRAY_EXP2:
'ARRAY' '[' value1=subrange_type (',' value2=subrange_type)? ']' 'OF'
;
subrange_type:
lower=INT upto=UPTO upper=INT;
UDT_SUB_SET_TYPE_DEF:
name=ID ':' dataType+=UDT_BASIC_TYPE '(' lower=INT_WITH_PLUS_MINUS_OPTIONAL upto=UPTO upper=INT_WITH_PLUS_MINUS_OPTIONAL ')' end=SEMICOLON;
UDT_ENUM_TYPE_DEF:
name=ID ':' '(' value+=UDT_FIELD_INIT_VALUE (',' value+=UDT_FIELD_INIT_VALUE)* ')' initValue=UDT_ENUM_INIT_VALUE? end=SEMICOLON;
UDT_FIELD_INIT_VALUE:
name=ID(op=":=" intValue=INT)?
;
UDT_ENUM_INIT_VALUE:
":=" symbol=ID;
UDT_DIRECT_TYPE_DEF:
name=ID ':' dataType=UDT_BASIC_TYPE (':=' initValue+=INT)? end=SEMICOLON;
UDT_STRUCT_TYPE_DEF:
name=ID ':' 'STRUCT'
statements+=UDT_STRUCT_STATEMENT+
'END_STRUCT' (end=SEMICOLON)?;
UDT_STRUCT_STATEMENT:
name=ID ':' ((ref_to?='REF_TO')| (pointer_to?=UDT_POINTER_TO))? (arry=UDT_ARRAY_EXP2)? dataType=(UDT_BASIC_TYPE|UDT_USERDEFINEDTYPENAME) (initValue=UDT_VAR_INIT_VALUE)? (end=SEMICOLON)?;
UDT_USERDEFINEDTYPENAME:
name=ID
;
UDT_POINTER_TO:
pointer="POINTER" to="TO"
;
UDT_BASIC_TYPE:
value=('BIT' | 'BOOL' | 'BYTE' | 'WORD' | 'DWORD' | 'LWORD' | 'SINT' | 'USINT' | 'INT' | 'UINT' | 'DINT' | 'UDINT'
| 'LINT'|'ULINT' | 'REAL' | 'LREAL' | 'STRING' | 'TIME' | 'TIME_OF_DAY' | 'TOD' | 'DATE' | 'DATE_AND_TIME' | 'DT' | 'WSTRING'
| 'ANY' | 'ANY_INT'
| 'ANY_REAL' | 'ANY_NUM' | 'ANY_DATE' | 'ANY_BIT');
UDT_VAR_INIT_VALUE:
op=':=' initValue=(UDT_ONE_DIMENSION_INIT |UDT_TWO_DIMENSION_INIT| UDT_VALUE_EXP | UDT_STRUCT_OR_FB_INIT);
UDT_TWO_DIMENSION_INIT:
'[' valueExp+=UDT_ONE_DIMENSION_INIT(','valueExp+=UDT_ONE_DIMENSION_INIT)* ']'
;
UDT_ONE_DIMENSION_INIT:
'[' valueExp+=( UDT_VALUE_EXP | UDT_STRUCT_OR_FB_INIT)(','valueExp+=(UDT_VALUE_EXP | UDT_STRUCT_OR_FB_INIT))* ']';
UDT_STRUCT_OR_FB_INIT:
leftbrace="(" paramList=UDT_INIT_PARAM_LIST rightbrace=")"
;
UDT_INIT_PARAM_LIST:
in+=UDT_INIT_PARAM (',' (comments+=ML_COMMENT)? in+=UDT_INIT_PARAM)*;
UDT_INIT_PARAM:
(inName=ID ':=' (comments+=ML_COMMENT)?)? exp=(UDT_ONE_DIMENSION_INIT |UDT_TWO_DIMENSION_INIT| UDT_VALUE_EXP | UDT_STRUCT_OR_FB_INIT);
UDT_VALUE_EXP:
(boolValue=('TRUE' | 'FALSE') | idValue=ID | strValue=STRING | intValueWithPlusOrMinus=INT_WITH_PLUS_MINUS |
intValue=INT | timeValue=TIME | todValue=TOD | dateValue=DATE | durationValue=DURATION | dtValue=DT | hexValue=HEX |
octValue=OCT | binaryValue=BINARY | real_value=REAL_NUMBER);
Number hidden():
HEX | (INT | REAL_NUMBER) ('.' (INT | REAL_NUMBER))?;
REAL_NUMBER returns ecore::EBigDecimal hidden():
('-' | '+')? INT '.' (EXT_INT | INT);
terminal EXT_INT:
INT ('e' | 'E') ('-' | '+')? INT;
terminal TIME:
('T#' | 't#') (INT 'h')? (INT 'm')? (INT 's')?;
terminal DATE:
('D#'|'DATE#') INT '-' INT '-' INT;
terminal DURATION:
('T#' | 't#') (INT 'd')? (INT 'h')? (INT 'm')? (INT 's')? (INT (. 'INT')? 'ms')?;
terminal DT:
('DT#'|'DATE_AND_TIME#') INT '-' INT '-' INT '-' INT ':' INT ':' INT '.' INT;
terminal TOD:
('TOD#' |'TIME_OF_DAY#') INT ':' INT ':' INT ('.' INT)?;
terminal HEX:
'16#' ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+;
terminal OCT:
'8#' ('0'..'8')+
;
terminal BINARY:
'2#' ('0'..'1' | '_')+;
INT_WITH_PLUS_MINUS_OPTIONAL returns ecore::EInt:
('-' | '+')? INT;
INT_WITH_PLUS_MINUS returns ecore::EInt:
('-' | '+') INT;
terminal INT returns ecore::EInt:
'0'..'9' ('0'..'9' | '_')*;
terminal SEMICOLON:
';';
UPTO hidden(WS):
'..';
terminal ID:
'^'? ('\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D'|'a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9'|'\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D')*;
terminal STRING:
'"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"' |
"'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'";
terminal fragment MLC_OTH:
!('*' | '(' | ')');
terminal fragment MLC_OTH_RP:
!('*' | '(');
terminal fragment MLC_LP_TOK:
'('+ ('*' MLC_BODY | MLC_OTH_RP);
terminal fragment MLC_X_TOK:
'*'+ (MLC_OTH | MLC_LP_TOK);
terminal fragment MLC_BODY:
(MLC_OTH_RP | MLC_LP_TOK | MLC_X_TOK)* '*'+ ')';
terminal ML_COMMENT:
'(*' MLC_BODY;
terminal SL_COMMENT:
'//' !('\n' | '\r')* ('\r'? '\n')?;
terminal WS:
(' ' | '\t' | '\r' | '\n')+;
terminal ANY_OTHER:
.;
GLVDsl.xtext
grammar com.abcd.glv.dsl.GLVDsl hidden(WS, ML_COMMENT, SL_COMMENT)
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
import "platform:/resource/com.abcd.udt.dsl/model/generated/UDTdsl.ecore" as UDT
generate gLVDsl "http://www.xxxxx.com/ide/plc/glv/dsl/GLVDsl"
GLOBAL_VARIABLES:
variables+=GLV_VAR_GLOBAL*
;
GLV_VAR_GLOBAL:
{GLV_VAR_GLOBAL} 'VAR_GLOBAL' (persistent?='PERSISTENT' | retain?='RETAIN' | non_retain?='NON_RETAIN' | constant?='CONSTANT')?
vars+=GLV_VAR_STATEMENT*
'END_VAR';
GLV_VAR_STATEMENT:
GLV_VAR_NAME end=SEMICOLON
;
GLV_VAR_NAME:
(({VAR_WITH_NAME}(name=ID) (loc=LOCATION_MAPPING)?) | {VAR_WITH_LOCATION}(loc=LOCATION_MAPPING)) ':' ((ref_to?='REF_TO') | (pointer_to?=POINTER_TO))? (array=GLV_ARRAY_TYPE)? ((type=GLV_BASIC_TYPE) |
userDefinedTypeName=complextDataType) intValue=GLV_VAR_INIT_VALUE?;
POINTER_TO:
pointer="POINTER" to="TO"
;
complextDataType:
name= [UDT::UDT_TYPE_DEF];
GLV_VAR_INIT_VALUE:
op=':=' initValue=(ONE_DIMENSION_INIT |TWO_DIMENSION_INIT| GLV_VALUE_EXP | STRUCT_OR_FB_INIT);
TWO_DIMENSION_INIT:
'[' valueExp+=ONE_DIMENSION_INIT(','valueExp+=ONE_DIMENSION_INIT)* ']'
;
ONE_DIMENSION_INIT:
'[' valueExp+=(GLV_VALUE_EXP | STRUCT_OR_FB_INIT)(','valueExp+=(GLV_VALUE_EXP | STRUCT_OR_FB_INIT))* ']';
STRUCT_OR_FB_INIT:
leftbrace="(" paramList=INIT_PARAM_LIST rightbrace=")"
;
INIT_PARAM_LIST:
in+=INIT_PARAM (',' (comments+=ML_COMMENT)? in+=INIT_PARAM)*;
INIT_PARAM:
(inName=ID ':=' (comments+=ML_COMMENT)?)? exp=(ONE_DIMENSION_INIT |TWO_DIMENSION_INIT| GLV_VALUE_EXP | STRUCT_OR_FB_INIT);
GLV_VALUE_EXP:
(boolValue=('TRUE' | 'FALSE') | idValue=ID | strValue=STRING | intValueWithPlusOrMinus=INT_WITH_PLUS_MINUS |
intValue=INT | timeValue=TIME | todValue=TOD | dateValue=DATE | durationValue=DURATION | dtValue=DT | hexValue=HEX |
octValue=OCT | binaryValue=BINARY | real_value=REAL_NUMBER);
LOCATION_MAPPING:
'AT' LOCATION;
GLV_ARRAY_TYPE hidden(WS):
'ARRAY' '[' dimension=DIMENSION ']' 'OF';
DIMENSION:
dimension+=subrange_type (',' dimension+=subrange_type)*;
subrange_type:
lower=INT upto=UPTO upper=INT;
terminal SEMICOLON:
';';
GLV_BASIC_TYPE:
value=('BIT' | 'BOOL' | 'BYTE' | 'WORD' | 'DWORD' | 'LWORD' | 'SINT' | 'USINT' | 'INT' | 'UINT' | 'DINT' | 'UDINT'
| 'LINT' | 'REAL' | 'LREAL' | 'STRING' | 'TIME' | 'TIME_OF_DAY' | 'TOD' | 'DATE' | 'DATE_AND_TIME' | 'DT' | 'WSTRING'
| 'ANY' | 'ANY_INT'
| 'ANY_REAL' | 'ANY_NUM' | 'ANY_DATE' | 'ANY_BIT');
terminal TIME:
('T#' | 't#') (INT 'h')? (INT 'm')? (INT 's')?;
terminal DATE:
('d#'|'D#') INT '-' INT '-' INT;
terminal DURATION:
('T#' | 't#') (INT 'd')? (INT 'h')? (INT 'm')? (INT 's')? (INT (. 'INT')? 'ms')?;
terminal DT:
('dt#'|'DT#') INT '-' INT '-' INT '-' INT ':' INT ':' INT ('.' INT)?;
terminal TOD:
('tod#'|'TOD#') INT ':' INT ':' INT ('.' INT)?;
terminal HEX:
'16#' ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+;
terminal BINARY:
'2#' ('0'..'1' | '_')+;
INT_WITH_PLUS_MINUS returns ecore::EIntegerObject:
'-' INT;
terminal INT returns ecore::EIntegerObject:
'0'..'9' ('0'..'9' | '_')*;
REAL_NUMBER returns ecore::EBigDecimal hidden():
('-' | '+')? INT '.' (EXT_INT | INT);
terminal EXT_INT:
INT ('e' | 'E') ('-' | '+')? INT;
terminal OCT:
'8#' ('0'..'8')+
;
UPTO hidden(WS):
'..';
terminal LOCATION:
'%' ('I' | 'Q' | 'M') (('*') | ('X' | 'B' | 'W' | 'D' | 'L')? ('0'..'9')+ (('.') ('0'..'9')+)?);
terminal ID:
'^'? ('\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D'|'a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9'|'\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D')*;
terminal STRING:
'"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"' |
"'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'";
terminal fragment MLC_OTH:
!('*' | '(' | ')');
terminal fragment MLC_OTH_RP:
!('*' | '(');
terminal fragment MLC_LP_TOK:
'('+ ('*' MLC_BODY | MLC_OTH_RP);
terminal fragment MLC_X_TOK:
'*'+ (MLC_OTH | MLC_LP_TOK);
terminal fragment MLC_BODY:
(MLC_OTH_RP | MLC_LP_TOK | MLC_X_TOK)* '*'+ ')';
terminal ML_COMMENT:
'(*' MLC_BODY;
terminal SL_COMMENT:
'//' !('\n' | '\r')* ('\r'? '\n')?;
terminal WS:
(' ' | '\t' | '\r' | '\n')+;
terminal ANY_OTHER:
.;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.07920 seconds