void Parser::parse(ExecState* exec, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> prpSource, int* sourceId, int* errLine, UString* errMsg) { ASSERT(!m_sourceElements); int defaultSourceId; int defaultErrLine; UString defaultErrMsg; RefPtr<SourceProvider> source = prpSource; if (!sourceId) sourceId = &defaultSourceId; if (!errLine) errLine = &defaultErrLine; if (!errMsg) errMsg = &defaultErrMsg; *errLine = -1; *errMsg = 0; Lexer& lexer = *exec->lexer(); if (startingLineNumber <= 0) startingLineNumber = 1; lexer.setCode(startingLineNumber, source); *sourceId = ++m_sourceId; int parseError = kjsyyparse(&exec->globalData()); bool lexError = lexer.sawError(); lexer.clear(); ParserRefCounted::deleteNewObjects(&exec->globalData()); if (parseError || lexError) { *errLine = lexer.lineNo(); *errMsg = "Parse error"; m_sourceElements.clear(); } if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) debugger->sourceParsed(exec, *sourceId, sourceURL, *source, startingLineNumber, *errLine, *errMsg); }
void Parser::parse(const UString& sourceURL, int startingLineNumber, const UChar* code, unsigned length, int* sourceId, int* errLine, UString* errMsg) { pushFunctionContext(0); ASSERT(!m_progNode); if (errLine) *errLine = -1; if (errMsg) *errMsg = 0; Lexer& lexer = KJS::lexer(); lexer.setCode(sourceURL, startingLineNumber, code, length); m_sourceId++; if (sourceId) *sourceId = m_sourceId; // Enable this and the #define YYDEBUG in grammar.y to debug a parse error //extern int kjsyydebug; //kjsyydebug=1; int parseError = kjsyyparse(); bool lexError = lexer.sawError(); lexer.clear(); clearNewNodes(); if (parseError || lexError) { if (errLine) *errLine = lexer.lineNo(); if (errMsg) *errMsg = "Parse error"; m_progNode = 0; return; } #ifdef KJS_VERBOSE fprintf( stderr, "%s\n", m_progNode->toString().ascii() ); #endif }