HL7x ANTLR File

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)
            ;