//--------------------------------------------------------------------------- int ParserTester::TestNames() { int iStat= 0, iErr = 0; *m_stream << "testing name restriction enforcement..."; Parser p; #define PARSER_THROWCHECK(DOMAIN, FAIL, EXPR, ARG) \ iErr = 0; \ ParserTester::c_iCount++; \ try \ { \ p.Define##DOMAIN(EXPR, ARG); \ } \ catch(Parser::exception_type&) \ { \ iErr = (FAIL==false) ? 0 : 1; \ } \ iStat += iErr; // constant names PARSER_THROWCHECK(Const, false, "0a", 1) PARSER_THROWCHECK(Const, false, "9a", 1) PARSER_THROWCHECK(Const, false, "+a", 1) PARSER_THROWCHECK(Const, false, "-a", 1) PARSER_THROWCHECK(Const, false, "a-", 1) PARSER_THROWCHECK(Const, false, "a*", 1) PARSER_THROWCHECK(Const, false, "a?", 1) PARSER_THROWCHECK(Const, false, "a?", 1) PARSER_THROWCHECK(Const, false, "a?", 1) PARSER_THROWCHECK(Const, true, "a", 1) PARSER_THROWCHECK(Const, true, "a_min", 1) PARSER_THROWCHECK(Const, true, "a_min0", 1) PARSER_THROWCHECK(Const, true, "a_min9", 1) // variable names value_type a; p.ClearConst(); PARSER_THROWCHECK(Var, false, "9a", &a) PARSER_THROWCHECK(Var, false, "0a", &a) PARSER_THROWCHECK(Var, false, "+a", &a) PARSER_THROWCHECK(Var, false, "-a", &a) PARSER_THROWCHECK(Var, false, "?a", &a) PARSER_THROWCHECK(Var, false, "!a", &a) PARSER_THROWCHECK(Var, false, "a+", &a) PARSER_THROWCHECK(Var, false, "a-", &a) PARSER_THROWCHECK(Var, false, "a*", &a) PARSER_THROWCHECK(Var, false, "a?", &a) PARSER_THROWCHECK(Var, true, "a", &a) PARSER_THROWCHECK(Var, true, "a_min", &a) PARSER_THROWCHECK(Var, true, "a_min0", &a) PARSER_THROWCHECK(Var, true, "a_min9", &a) PARSER_THROWCHECK(Var, false, "a_min9", 0) // Postfix operators // fail PARSER_THROWCHECK(PostfixOprt, false, "(k", f1of1) PARSER_THROWCHECK(PostfixOprt, false, "9+", f1of1) PARSER_THROWCHECK(PostfixOprt, false, "+", 0) // pass PARSER_THROWCHECK(PostfixOprt, true, "-a", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "?a", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "_", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "#", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "&&", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "||", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "&", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "|", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "++", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "--", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "?>", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "?<", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "**", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "xor", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "and", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "or", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "not", f1of1) PARSER_THROWCHECK(PostfixOprt, true, "!", f1of1) // Binary operator // The following must fail with builtin operators activated // p.EnableBuiltInOp(true); -> this is the default PARSER_THROWCHECK(Oprt, false, "+", f1of2) PARSER_THROWCHECK(Oprt, false, "-", f1of2) PARSER_THROWCHECK(Oprt, false, "*", f1of2) PARSER_THROWCHECK(Oprt, false, "/", f1of2) // without activated built in operators it should work p.EnableBuiltInOprt(false); PARSER_THROWCHECK(Oprt, true, "+", f1of2) PARSER_THROWCHECK(Oprt, true, "-", f1of2) PARSER_THROWCHECK(Oprt, true, "*", f1of2) PARSER_THROWCHECK(Oprt, true, "/", f1of2) #undef PARSER_THROWCHECK if (iStat==0) *m_stream << "passed" << endl; else *m_stream << "\n failed with " << iStat << " errors" << endl; return iStat; }