The following grammar (in the ANLTR parser generator notation) defines the syntax of promotion selection expressions.
grammar SentinelPromotionScript;
promotionCondition
: predicate EOF
;
predicate
: andPred ('||' andPred)*
;
andPred
: condition ('&&' condition)*
;
condition
: '(' predicate ')'
| '!' condition
| comparison
;
comparison
: expression (COMPARATOR expression)?
;
expression
: ID ('.' ID)* '(' argumentList? ')'
| id=ID ('.' ID)* (pathExpr)? //a variable is a function without args
| LONG
| STRING
;
argumentList
: expression (',' expression )*
;
pathExpr
: '/' relativePathExpr?
| '//' relativePathExpr
| relativePathExpr
;
relativePathExpr:
stepExpr
(( '/' | '//' ) stepExpr )*
;
stepExpr:
( '.'
| abbrevForwardStep
) (xpathpredicate)?
;
abbrevForwardStep
: attributeFlag = '@'? (stQName = qName | stNodeExpansion = '*')
;
xpathpredicate
: '[' orExpr ']'
;
orExpr : andExpr ('or' andExpr)*
;
andExpr : comparisonexpr ('and' comparisonexpr)*
;
comparisonexpr: primaryExpr (COMPARATOR literal)?;
primaryExpr
: pathExpr | '(' pathExpr ')' | LONG
;
literal : STRING | numericLiteral | varRef;
numericLiteral: LONG DECIMALLITERAL | DOUBLELITERAL;
qName: (ID ':' ID) | ID;
varRef: '$' nCName;
nCName: ID ('.' ID)*;
COMPARATOR : '==' | '<' | '>' | '!=' | '<=' | '>=';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
LONG : ('-')? '0'..'9'+ ;
DECIMALLITERAL : ('.' ('0'..'9')+) | (('0'..'9')+ '.' '0'..'9'*);
DOUBLELITERAL : (('.' ('0'..'9')+) | (('0'..'9')+ ('.' '0'..'9'*)?)) ('e' | 'E') ('+' | '-')? ('0'..'9')+;
STRING
: '"' ~('\\'|'"')* '"'
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
)
;
