grammar Hl7x;
/*********************************************************************************************************************
Parser rules
*********************************************************************************************************************/
/************************
Entry point rule for all programs.
************************/
prog :
(msgDef | grpDef | segDef | typDef | xlateDef)*
;
/************************
HL7 Message definition.
************************/
msgDef :
MSG_KW '(' MSG_SEG_GRP_TYP_XLATE_NAME ',' HL7_VER ',' STRING ')'
'{'
(segPart | grpPart)+
'}'
';'
;
/************************
HL7 Group definition.
************************/
grpDef :
GRP_KW '(' MSG_SEG_GRP_TYP_XLATE_NAME ',' HL7_VER ',' STRING ')'
'{'
(grpPart | segPart)+
'}'
';'
;
/************************
HL7 Segment definition.
************************/
segDef :
SEG_KW '(' MSG_SEG_GRP_TYP_XLATE_NAME ',' HL7_VER ',' STRING ')'
'{'
(typPart | typStrPart)+
'}'
';'
;
/************************
HL7 Complex Type definition.
************************/
typDef :
TYP_KW '(' MSG_SEG_GRP_TYP_XLATE_NAME ',' HL7_VER ',' STRING ')'
'{'
(typStrPart)+
'}'
';'
;
/************************
Segment, group and type parts. These appear in message, group and segment definitions.
************************/
grpPart :
GRP_PART_NAME
'<'
HL7_VER
'>'
'(' CARDINALITY ',' CARDINALITY ')'
';'
;
segPart :
SEG_PART_NAME
'<'
HL7_VER
'>'
'(' CARDINALITY ',' CARDINALITY ')'
';'
;
typStrPart :
TST_KW
'(' CARDINALITY ',' CARDINALITY ',' STRING ')'
';'
;
typPart :
TYP_PART_NAME
'<'
HL7_VER
'>'
'(' CARDINALITY ',' CARDINALITY ',' STRING ')'
';'
;
/************************
xlate (message translation) definition
************************/
xlateDef :
XLATE_KW '('
MSG_SEG_GRP_TYP_XLATE_NAME
','
MSG_SEG_GRP_TYP_XLATE_NAME '<' HL7_VER '>'
','
MSG_SEG_GRP_TYP_XLATE_NAME '<' HL7_VER '>'
','
STRING
')'
'{'
(xlateOperationLhs '->' xlateOperationRhs ';')+
'}'
';'
;
/************************
The LHS and RHS operations within an xlate definition
************************/
xlateOperationLhs
:
MSG_SEG_GRP_TYP_XLATE_NAME(HL7_SELECTOR)?
|
EXPR_KW '(' STRING ',' STRING ')'
;
xlateOperationRhs
:
MSG_SEG_GRP_TYP_XLATE_NAME(HL7_SELECTOR)?
;
/*********************************************************************************************************************
Lexer rules
*********************************************************************************************************************/
COMMENT_LINE
:
'//' .*? ('\r\n' | '\r' | '\n') -> channel (HIDDEN)
;
COMMENT_BLOCK
:
'/*' .*? '*/' -> channel (HIDDEN)
;
MSG_KW : 'msg'
;
SEG_KW : 'seg'
;
GRP_KW : 'grp'
;
TYP_KW : 'typ'
;
/* string type keyword */
TST_KW : 'tST'
;
XLATE_KW : 'xlate'
;
EXPR_KW : 'expr'
;
SEG_PART_NAME
:
's'
('A'..'Z' | '0'..'9')
('A'..'Z' | '0'..'9')
('A'..'Z' | '0'..'9')
;
GRP_PART_NAME
:
'g'
('A'..'Z' | '0'..'9' | '_')*
;
TYP_PART_NAME
:
't'
('A'..'Z' | '0'..'9' | '_')*
;
MSG_SEG_GRP_TYP_XLATE_NAME
:
('A'..'Z')('A'..'Z' | '0'..'9' | '_')*
;
HL7_VER :
'v'('a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '_')+
;
HL7_SELECTOR
:
(
'[' ('1'..'9')('0'..'9')* ']'
|
'.' ('1'..'9')('0'..'9')*
)+
;
CARDINALITY
:
'*'
|
('0'..'9')+
;
STRING :
'"' ~('"')* '"'
;
WS :
[ \r\n\t] + -> channel (HIDDEN)
;