// Copyright (c) 2008-2010 by Kavanagh Consultancy Limited. All rights reserved.
ArchetypeLanguage : // Syntax Rules
archetype := statementBlock
statementBlock := { literalTextLine | controlStatement }*
literalTextLine := ! '.' { literalText | substitutionVariable }* endOfLine
controlStatement := selectStatement
| forBlock
| breakForStatement
| whileBlock
| breakWhileStatement
| assignStatement
| ifBlock
| functionBlock
| invokeStatement
| emitStatement
| clearStatement
| includeStatement
| printStatement
| exitStatement
// 9.1.3. Data Access Control Statements
selectStatement := '.' SELECT ( ( ONE | ANY | MANY ) variable RELATED BY instanceChain
| ( ANY | MANY ) variable FROM INSTANCES OF objectKeyLetters )
[ WHERE condition ] endOfLine
instanceChain := variable { relationshipTraversal }+
// Use of verbPhrase is not explicitly supported in BridgePoint archetype language,
// but it is supported in BridgePoint action language
// Use of role below is not supported in BridgePoint
relationshipTraversal := "->" objectKeyLetters '[' relationshipID [ '.' ( IR | RI | verbPhrase | role ) ] ']'
objectKeyLetters := name // Allow keyword
verbPhrase := unconstrainedName
role := name // Allow keyword
condition := expression
forBlock := forStatement statementBlock endForStatement
forStatement := '.' FOR EACH variable IN variable endOfLine
endForStatement := '.' END FOR endOfLine
breakForStatement := '.' BREAK FOR endOfLine
whileBlock := whileStatement statementBlock endWhileStatement
whileStatement := '.' WHILE condition endOfLine
endWhileStatement := '.' END WHILE endOfLine
breakWhileStatement := '.' BREAK WHILE endOfLine
// 9.1.4. Transformer Control Statements
assignStatement := '.' ASSIGN variable [ '.' attribute ] '=' expression endOfLine
variable := name && ! keyword
attribute := name // Allow keyword
// 9.1.5. Tester Control Statements
ifBlock := ifStatement statementBlock { elifStatement statementBlock }*
[ elseStatement statementBlock ] endIfStatement
ifStatement := '.' IF condition endOfLine
elifStatement := '.' ELIF condition endOfLine
elseStatement := '.' ELSE endOfLine
endIfStatement := '.' END IF endOfLine
// 9.1.6. Function Control Statements
functionBlock := functionStatement { parameterStatement }* statementBlock endFunctionStatement
functionStatement := '.' FUNCTION functionName endOfLine
functionName := name && ! keyword
parameterStatement := '.' PARAM parameterType parameterName endOfLine
parameterType := BOOLEAN | INTEGER | REAL | STRING | INST_REF | INST_REF_SET | FRAG_REF
parameterName := name && ! keyword
endFunctionStatement := '.' END FUNCTION endOfLine
invokeStatement := '.' INVOKE [ variable '=' ] functionName
'(' [ actualParameter { ',' actualParameter }* ] ')' endOfLine
actualParameter := rvalue
// 9.1.7. File Control Statements
emitStatement := '.' EMIT TO FILE fileName endOfLine
fileName := stringLiteral
clearStatement := '.' CLEAR endOfLine
includeStatement := '.' INCLUDE fileName endOfLine
printStatement := '.' PRINT errorMessage endOfLine
errorMessage := stringLiteral
exitStatement := '.' EXIT exitStatus endOfLine
exitStatus := integerLiteral
// 9.1.8. Rvalues
rvalue := literalValue | variable [ '.' attribute ] | SELECTED '.' attribute
literalValue := booleanLiteral | integerLiteral | realLiteral | stringLiteral
booleanLiteral := TRUE | FALSE
stringLiteral := stringQuotes { stringLiteralText | substitutionVariable }* stringQuotes
// 9.1.9. Expressions
expression := '(' unaryOperator expression ')'
| '(' expression binaryOperator expression ')'
| rvalue
unaryOperator := NOT | EMPTY | NOT_EMPTY | FIRST | NOT_FIRST | LAST | NOT_LAST | CARDINALITY
binaryOperator := AND | OR | '+' | '-' | '*' | '/' | '%' | '<' | "<=" | "==" | "!=" | ">=" | '>'
// 9.1.10. Substitution Variables
substitutionVariable := substitutionFormat
( instanceChain '.' attribute [ ':' parseKeyword ]
| variable [ '.' attribute [ ':' parseKeyword ] ]
| INFO '.' informationAttribute
| SELECTED { relationshipTraversal }* '.' attribute [ ':' parseKeyword ] )
endOfSubstitution
parseKeyword := name // Allow keyword
informationAttribute := DATE | USER_ID | ARCH_FILE_LINE | ARCH_FILE_NAME
| INTERPRETER_PLATFORM | INTERPRETER_VERSION | UNIQUE_NUM
ArchetypeLanguage :: // Lexical Rules
input := { literalTextLineInput | commentLine | controlStatementLine }*
literalTextLineInput := { literalText | substitutionVariableInput }*
&& ( { whitespace }* ( ! '.' | ".." ) ) endOfLine
literalText ::= { ! '$' ! '\n' $anyCharacter | "$$" }+
substitutionVariableInput := substitutionFormat { whitespace | token }* endOfSubstitution
substitutionFormat ::= '$' [ 'U' | 'u' | 'C' | 'c' | 'L' | 'l' ] [ '_' | 'R' | 'r' ] '{'
whitespace := ! '\n' $javaWhitespace
endOfSubstitution ::= '}'
endOfLine ::= $endOfLine
commentLine := { whitespace }* '.' ( "//" | nonTokenCOMMENT ) { ! '\n' $anyCharacter }* $endOfLine
nonTokenCOMMENT := ( "comment" | "COMMENT" | "Comment" ) ! namePart
controlStatementLine := { whitespace | token }* endOfLine
// Tokens
token := name | unconstrainedName | integerLiteral | realLiteral | stringLiteralInput | separatorOrOperator
name ::= nameStart { namePart }*
nameStart := 'a'..'z' | 'A'..'Z' | '_'
namePart := 'a'..'z' | 'A'..'Z' | '0'..'9' | '_'
unconstrainedName ::= '\'' { ! '\'' ! '\n' $anyCharacter | "''" }+ '\''
integerLiteral ::= [ '-' ] { '0'..'9' }+ ! '.'
realLiteral ::= [ '-' ] { '0'..'9' }+ '.' { '0'..'9' }+
stringLiteralInput := stringQuotes { stringLiteralText | substitutionVariableInput }* stringQuotes
stringQuotes ::= '"'
stringLiteralText ::= { ! '$' ! '"' ! '\n' $anyCharacter | "$$" | "\"\"" }+
separatorOrOperator ::= "!=" | "->" | "<=" | "==" | ">=" | '%' | '(' | ')' | '*' | '+'
| ',' | '-' | '.' | '/' | '<' | '=' | '>' | '[' | ']'
// Special Name Tokens
relationshipID ::= ( 'R' | 'r' ) '1'..'9' { '0'..'9' }* ! namePart
keyword := AND | ANY | ARCH_FILE_LINE | ARCH_FILE_NAME | ASSIGN
| BODY | BOOLEAN | BREAK | BY
| CARDINALITY | CLEAR | COMMENT
| DATE
| EACH | ELIF | ELSE | EMIT | EMPTY | END | EXIT
| FALSE | FILE | FIRST | FOR | FRAG_REF | FROM | FUNCTION
| IF | IN | INCLUDE | INFO | INSTANCES | INST_REF | INST_REF_SET | INTEGER
| INTERPRETER_PLATFORM | INTERPRETER_VERSION | INVOKE | IR
| LAST
| MANY
| NOT | NOT_EMPTY | NOT_FIRST | NOT_LAST
| OF | ONE | OR
| PARAM | PRINT
| REAL | RELATED | RI
| SELECT | SELECTED | STRING
| TO | TRUE
| UNIQUE_NUM | USER_ID
| WHERE | WHILE
AND ::= ( "and" | "AND" | "And" ) ! namePart
ANY ::= ( "any" | "ANY" | "Any" ) ! namePart
ARCH_FILE_LINE ::= ( "arch_file_line" | "ARCH_FILE_LINE" | "Arch_file_line" ) ! namePart
ARCH_FILE_NAME ::= ( "arch_file_name" | "ARCH_FILE_NAME" | "Arch_file_name" ) ! namePart
ASSIGN ::= ( "assign" | "ASSIGN" | "Assign" ) ! namePart
BODY ::= ( "body" | "BODY" | "Body" ) ! namePart
BOOLEAN ::= ( "boolean" | "BOOLEAN" | "Boolean" ) ! namePart
BREAK ::= ( "break" | "BREAK" | "Break" ) ! namePart
BY ::= ( "by" | "BY" | "By" ) ! namePart
CARDINALITY ::= ( "cardinality" | "CARDINALITY" | "Cardinality" ) ! namePart
CLEAR ::= ( "clear" | "CLEAR" | "Clear" ) ! namePart
COMMENT ::= ( "comment" | "COMMENT" | "Comment" ) ! namePart
DATE ::= ( "date" | "DATE" | "Date" ) ! namePart
EACH ::= ( "each" | "EACH" | "Each" ) ! namePart
ELIF ::= ( "elif" | "ELIF" | "Elif" ) ! namePart
ELSE ::= ( "else" | "ELSE" | "Else" ) ! namePart
EMIT ::= ( "emit" | "EMIT" | "Emit" ) ! namePart
EMPTY ::= ( "empty" | "EMPTY" | "Empty" ) ! namePart
END ::= ( "end" | "END" | "End" ) ! namePart
EXIT ::= ( "exit" | "EXIT" | "Exit" ) ! namePart
FALSE ::= ( "false" | "FALSE" | "False" ) ! namePart
FILE ::= ( "file" | "FILE" | "File" ) ! namePart
FIRST ::= ( "first" | "FIRST" | "First" ) ! namePart
FOR ::= ( "for" | "FOR" | "For" ) ! namePart
FRAG_REF ::= ( "frag_ref" | "FRAG_REF" | "Frag_ref" ) ! namePart
FROM ::= ( "from" | "FROM" | "From" ) ! namePart
FUNCTION ::= ( "function" | "FUNCTION" | "Function" ) ! namePart
IF ::= ( "if" | "IF" | "If" ) ! namePart
IN ::= ( "in" | "IN" | "In" ) ! namePart
INCLUDE ::= ( "include" | "INCLUDE" | "Include" ) ! namePart
INFO ::= ( "info" | "INFO" | "Info" ) ! namePart
INSTANCES ::= ( "instances" | "INSTANCES" | "Instances" ) ! namePart
INST_REF ::= ( "inst_ref" | "INST_REF" | "Inst_ref" ) ! namePart
INST_REF_SET ::= ( "inst_ref_set" | "INST_REF_SET" | "Inst_ref_set" ) ! namePart
INTEGER ::= ( "integer" | "INTEGER" | "Integer" ) ! namePart
INTERPRETER_PLATFORM ::= ( "interpreter_platform" | "INTERPRETER_PLATFORM" | "Interpreter_platform" ) ! namePart
INTERPRETER_VERSION ::= ( "interpreter_version" | "INTERPRETER_VERSION" | "Interpreter_version" ) ! namePart
INVOKE ::= ( "invoke" | "INVOKE" | "Invoke" ) ! namePart
IR ::= ( "ir" | "IR" | "Ir" ) ! namePart
LAST ::= ( "last" | "LAST" | "Last" ) ! namePart
MANY ::= ( "many" | "MANY" | "Many" ) ! namePart
NOT ::= ( "not" | "NOT" | "Not" ) ! namePart
NOT_EMPTY ::= ( "not_empty" | "NOT_EMPTY" | "Not_empty" ) ! namePart
NOT_FIRST ::= ( "not_first" | "NOT_FIRST" | "Not_first" ) ! namePart
NOT_LAST ::= ( "not_last" | "NOT_LAST" | "Not_last" ) ! namePart
OF ::= ( "of" | "OF" | "Of" ) ! namePart
ONE ::= ( "one" | "ONE" | "One" ) ! namePart
OR ::= ( "or" | "OR" | "Or" ) ! namePart
PARAM ::= ( "param" | "PARAM" | "Param" ) ! namePart
PRINT ::= ( "print" | "PRINT" | "Print" ) ! namePart
REAL ::= ( "real" | "REAL" | "Real" ) ! namePart
RELATED ::= ( "related" | "RELATED" | "Related" ) ! namePart
RI ::= ( "ri" | "RI" | "Ri" ) ! namePart
SELECT ::= ( "select" | "SELECT" | "Select" ) ! namePart
SELECTED ::= ( "selected" | "SELECTED" | "Selected" ) ! namePart
STRING ::= ( "string" | "STRING" | "String" ) ! namePart
TO ::= ( "to" | "TO" | "To" ) ! namePart
TRUE ::= ( "true" | "TRUE" | "True" ) ! namePart
UNIQUE_NUM ::= ( "unique_num" | "UNIQUE_NUM" | "Unique_num" ) ! namePart
USER_ID ::= ( "user_id" | "USER_ID" | "User_id" ) ! namePart
WHERE ::= ( "where" | "WHERE" | "Where" ) ! namePart
WHILE ::= ( "while" | "WHILE" | "While" ) ! namePart
// End of File