\> return T_GREATER_THAN;
}
-\( { yyextra->m_IgnoreNewlines++; return '('; }
-\) { yyextra->m_IgnoreNewlines--; return ')'; }
-[\r\n]+ { yycolumn -= strlen(yytext) - 1; if (!yyextra->m_IgnoreNewlines) { return T_NEWLINE; } }
+\( { yyextra->m_IgnoreNewlines.push(true); return '('; }
+\) { yyextra->m_IgnoreNewlines.pop(); return ')'; }
+[\r\n]+ { yycolumn -= strlen(yytext) - 1; if (!yyextra->m_IgnoreNewlines.top()) { return T_NEWLINE; } }
<<EOF>> { if (!yyextra->m_Eof) { yyextra->m_Eof = true; return T_NEWLINE; } else { yyterminate(); } }
. return yytext[0];
//yydebug = 1;
+ m_IgnoreNewlines.push(false);
+
if (yyparse(&llist, this) != 0)
return NULL;
+ m_IgnoreNewlines.pop();
+
std::vector<Expression *> dlist;
typedef std::pair<Expression *, EItemInfo> EListItem;
int num = 0;
rterm_scope_require_side_effect: '{'
{
+ context->m_IgnoreNewlines.push(false);
context->m_OpenBraces++;
}
statements '}'
{
context->m_OpenBraces--;
+ context->m_IgnoreNewlines.pop();
std::vector<Expression *> dlist;
typedef std::pair<Expression *, EItemInfo> EListItem;
int num = 0;
rterm_scope: '{'
{
+ context->m_IgnoreNewlines.push(false);
context->m_OpenBraces++;
}
statements '}'
{
context->m_OpenBraces--;
+ context->m_IgnoreNewlines.pop();
std::vector<Expression *> dlist;
typedef std::pair<Expression *, EItemInfo> EListItem;
int num = 0;
ConfigCompiler::ConfigCompiler(const String& path, std::istream *input,
const String& zone, const String& package)
: m_Path(path), m_Input(input), m_Zone(zone), m_Package(package),
- m_Eof(false), m_OpenBraces(0), m_IgnoreNewlines(0)
+ m_Eof(false), m_OpenBraces(0)
{
InitializeScanner();
}
bool m_Eof;
int m_OpenBraces;
- int m_IgnoreNewlines;
std::ostringstream m_LexBuffer;
CompilerDebugInfo m_LocationBegin;
+ std::stack<bool> m_IgnoreNewlines;
std::stack<bool> m_Apply;
std::stack<bool> m_ObjectAssign;
std::stack<bool> m_SeenAssign;
expr = ConfigCompiler::CompileText("<test>", "\"\\'test\"");
BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
delete expr;
+
+ expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
+ BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
+ delete expr;
}
BOOST_AUTO_TEST_CASE(advanced)