Beispiel #1
0
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);
}
Beispiel #2
0
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
}