Errors, type used instead of an ID I think
Includes is included even if they do not have the right define?

=====================================================================

TESTSUITE is the generated optestsuite.cpp file.
A TESTFILE is a *.ot file.

The desctiption is a close to BNF style grammar, with a few shortcuts
to make the grammar simpler.

=====================================================================

TESTSUITE => TESTFILE*
TESTFILE => TOPLEVEL_PART*
TOPLEVEL_PART => [DISABLED_PART | GROUP_PART]*
DISABLED_PART => disabled;
LANGUAGE_PART => language LANGUAGE;
LANGUAGE => c++ | c | ecmascript | html 
GROUP_PART => group STRING; GROUP_CONTENT
STRING => "CHAR*" | COMMENTS_STRING | COMBINED_STRING
COMBINED_STRING => (COMBINED_STRING_CONTENT)
COMBINED_STRING_CONTENT => COMBINED_STRING_CONTENT [+] "CHAR*" | "CHAR*"
COMMENTS_STRING => [//!CHAR*\n]+
CHAR => any unicode char (some must be quoted, C string with extended escapes)
GROUP_CONTENT => [LANGUAGE_PART | INCLUDE_PART | MANUAL_PART
                  | SUBTEST_PART | TEST_EQUAL_PART | TEST_NEQUAL_PART
				  | HTML_PART | DATA_PART | TEST_PART | REQUIRE_PART | GLOBAL_PART
				  | SETUP_PART | EXIT_PART | TABLE_PART | FOREACH_PART]*
INCLUDE_IF_EXPRESSION => ID | exists | defined(ID) || undefined(ID)
INCLUDE_IF_EXPRESSIONS => [(] INCLUDE_IF_EXPRESSION [)] [&&] INCLUDE_IF_EXPRESSIONS | INCLUDE_IF_EXPRESSION
INCLUDE_IF_PART => if(EXPRESSIONS)
INCLUDE_PART => include [INCLUDE_IF_PART] "LABEL";
LABEL => [a-zA-Z0-9_/.]+
TEST_PART => test(STRING) TEST_MODIFIER* { BODY } FINALLY?
MANUAL_PART => manual(STRING,STRING) TEST_MODIFIER*;
TEST_MODIFIER => COMMON_MODIFIER | LANGUAGE_PART | async; | manual;
COMMON_MODIFIER => REQUIRE_MODIFIER | DISABLED_PART | leakcheck; | DELAY_MODIFIER
                   | fails; | REPEAT_MODIFIER 
DELAY_MODIFIER => delay [pre | post] FLOAT;
FLOAT => floating point number
REPEAT_MODIFIER => repeat INTEGER;
INTEGER => positive integer
REQUIRE_MODIFIER => require [init | noinit | SUCCESS | FAILURE | UNDEFINED | ID];
SUCCESS => success STRING
FAILURE => failure STRING
UNDEFINED => undefined ID
ID => [a-zA-Z_][a-zA-Z_0-9]*
BODY => CPLUSPLUS_BODY | ECMASCRIPT_BODY | HTML_BODY
HTML_BODY => STRING
CPLUSPLUS_BODY => (CPLUSPLUS_STATEMENT | VERIFY | FOREACH_TEST_PART | ITERATE_TEST_PART)*
ECMASCRIPT_BODY => (ECMASCRIPT_STATEMENT | VERIFY | FOREACH_TEST_PART | ITERATE_TEST_PART)*
FINALLY => finally { CPLUSPLUS_STATEMENT* }
CPLUSPLUS_STATEMENT => any c++ statement, read your c++ specification for this, please!
ECMASCRIPT_STATEMENT => any ecmascript statement, read your ecmascript specification for this, please!
VERIFY => verify(CPLUSPLUS_EXPR);
CPLUSPLUS_EXPR => any c++ expression, read your c++ specification for this, please!
SUBTEST_PART => subtest ID(CPLUSPLUS_PARAMETER_LIST) { CPLUSPLUS_BODY } FINALLY?
CPLUSPLUS_PARAMETER_LIST => a c++ parameter list, read your c++ specification for this, please!
TEST_EQUAL_PART => test_equal TEST_COMPARE_CONTENT
TEST_NEQUAL_PART => test_nequal TEST_COMPARE_CONTENT
TEST_COMPARE_CONTENT => (STRING,"%[d|f|p|s]",CPLUSPLUS_EXPR,CPLUSPLUS_EXPR) COMMON_MODIFIER* ;
HTML_PART => [html|text|xml] { STRING }
DATA_PART => data STRING { STRING }
GLOBAL_PART => global { CPLUSPLUS_STATEMENT* }
SETUP_PART => setup { CPLUSPLUS_STATEMENT* }
EXIT_PART => exit { CPLUSPLUS_STATEMENT* }
TABLE_PART => table ID[(TYPE_LIST)]? [{ TABLE_CELL_LIST } | read STRING; | FILE_LIST ]
TYPE_LIST => TYPE_LIST, type | type
TABLE_CELL_LIST => TABLE_CELL_LIST, TABLE_CELL | TABLE_CELL
TABLE_CELL => { TABLE_VALUE_LIST }
TABLE_VALUE_LIST => TABLE_VALUE_LIST, TABLE_VALUE | TABLE_VALUE
TABLE_VALUE => CPLUSPLUS_EXPR[:STRING]
FOREACH_PART => foreach (IDLIST) from [ID | { TABLE_CELL_LIST }] { GROUP_CONTENT }
FOREACH_TEST_PART => foreach (IDLIST) from [ID | { TABLE_CELL_LIST }] { BODY }
ITERATE_TEST_PART => iterate (IDLIST) from ID { BODY }
FILE_LIST => filelist OR_LIST [NAME_LIST]? [recursively]? ;
OR_LIST => OR_LIST or STRING | STRING
NAME_LIST => name OR_LIST
