---
     ANY: '[\s\S]'     # Any unicode character
     SPACE: '[\ \t]'   # A space or tab character
     SPACES: '\ \t'    #   For use in character classes
     BREAK: '\n'       # A newline character
     EOL: '\r?\n'      # A Unix or DOS line ending
     NON_BREAK: '.'    # Any character except newline
     LOWER: '[a-z]'    # Lower case ASCII alphabetic character
     UPPER: '[A-Z]'    # Upper case ASCII alphabetic character
     ALPHANUM: '[A-Za-z0-9]'    # ASCII alphanumeric character
     WORD: '\w'        # ie '[A-Za-z0-9_]' - A "word" character
     DIGIT: '[0-9]'    # A numeric digit
     DOLLAR: '\$'      # A dollar sign
     DOT: '\.'         # A period character
     HASH: '#'         # An octothorpe (or hash) character
     BACK: '\'         # A backslash character
     SINGLE: "'"       # A single quote character
     DOUBLE: '"'       # A double quote character
     ESCAPE: '[0nt]'   # One of the escapable character IDs
     
     document:
     - meta_section
     - test_section
     - /:
       - data_section
       ^: '?'
     
     meta_section:
     - /(?:$comment|$blank_line)*/
     - /: 
       - meta_testml_statement
       - _: No TestML meta directive found
     - /:
       - meta_statement
       - comment
       - blank_line
       ^: '*'
     
     comment: /$HASH$line/
     line: /$NON_BREAK*$EOL/
     blank_line: /$SPACE*$EOL/
     
     meta_testml_statement: /%TestML:$SPACE+($testml_version)(?:$SPACE+$comment|$EOL)/
     
     testml_version: /($DIGIT$DOT$DIGIT+)/
     
     meta_statement: /%($meta_keyword):$SPACE+($meta_value)(?:$SPACE+$comment|$EOL)/
     
     meta_keyword: /(?:$core_meta_keyword|$user_meta_keyword)/
     core_meta_keyword: /(?:Title|Data|Plan|BlockMarker|PointMarker)/
     user_meta_keyword: /$LOWER$WORD*/
     
     meta_value: /(?:$single_quoted_string|$double_quoted_string|$unquoted_string)/
     
     single_quoted_string: /(?:$SINGLE(([^$BREAK$BACK$SINGLE]|$BACK$SINGLE|$BACK$BACK)*?)$SINGLE)/
     
     double_quoted_string: /(?:$DOUBLE(([^$BREAK$BACK$DOUBLE]|$BACK$DOUBLE|$BACK$BACK|$BACK$ESCAPE)*?)$DOUBLE)/
     
     unquoted_string: /[^$SPACES$BREAK$HASH](?:[^$BREAK$HASH]*[^$SPACES$BREAK$HASH])?/
     
     test_section:
     - /:
       - ws
       - test_statement
       ^: '*'
     
     ws: /(?:$SPACE|$EOL|$comment)/
     
     test_statement:
     - test_expression
     - =: assertion_expression
       ^: '?'
     - /:
       - /;/
       - _: You seem to be missing a semicolon
     
     test_expression:
     - sub_expression
     - /:
       - - '!assertion_call_start'
         - call_indicator
         - sub_expression
       ^: '*'
     
     sub_expression:
     - /:
       - transform_call
       - data_point
       - quoted_string
       - constant
     
     transform_call:
     - transform_name
     - /\($ws*/
     - argument_list
     - /$ws*\)/
     
     transform_name:
       /:
       - user_transform
       - core_transform
     
     user_transform: /($LOWER$WORD*)/
     
     core_transform: /($UPPER$WORD*)/
     
     call_indicator: /(?:$DOT$ws*|$ws*$DOT)/
     
     data_point: /($DOLLAR$LOWER$WORD*)/
     
     constant: /($UPPER$WORD*)/
     
     argument_list:
       =:
       - argument
       - =:
         - /$ws*,$ws*/
         - argument
         ^: '*'
       ^: '?'
     
     argument:
     - sub_expression
     
     quoted_string:
       /:
       - single_quoted_string
       - double_quoted_string
     
     assertion_expression:
       /:
       - assertion_operation
       - assertion_call
     
     assertion_operation:
     - /$ws+/
     - assertion_operator
     - /$ws+/
     - test_expression
     
     assertion_operator: /(==)/
     
     assertion_call:
     - assertion_call_start
     - test_expression
     - /$ws*\)/
     
     assertion_call_start:
     - /$call_indicator$assertion_name\($ws*/
     
     assertion_name: /EQ/
     
     data_section: /($block_marker(?:$SPACE|$EOL)$ANY+|\Z)/
     
     data:
       =: data_block
       ^: '*'
     
     data_block:
     - block_header
     - /:
       - blank_line
       - comment
       ^: '*'
     - =: block_point
       ^: '*'
     
     block_header:
     - block_marker
     - =:
       - /$SPACE+/
       - block_label
       ^: '?'
     - /$SPACE*$EOL/
     
     block_marker: /===/
     
     block_label:
     - /([^$SPACES$BREAK]($NON_BREAK*[^SPACES$BREAK])?)/
     
     block_point:
       /:
       - lines_point
       - phrase_point
     
     lines_point:
     - /$point_marker$SPACE+/
     - user_point_name
     - /$SPACE*$EOL/
     - point_lines
     
     user_point_name: /($LOWER$WORD*)/
     
     point_lines: /((?:(?!$block_marker|$point_marker)$line)*)/
     
     phrase_point:
     - /$point_marker$SPACE+/
     - user_point_name
     - /:$SPACE/
     - point_phrase
     - /$EOL/
     - /(?:$comment|$blank_line)*/
     
     point_phrase: /($NON_BREAK*)/
     
     
     point_marker: /---/