codeparser.cpp

来自「语法检查程序」· C++ 代码 · 共 56 行

CPP
56
字号
/***************************************************************************/
/* NOTE:                                                                   */
/* This document is copyright (c) by Oz Solomon and Yonat Sharon, and is   */
/* bound by the MIT open source license.                                   */ 
/* See License.txt or visit www.opensource.org/licenses/mit-license.html   */
/***************************************************************************/

#include "CodeParser.h"
#include "CodeState.h"

const CodeParser::Datum CodeParser::cDefaultDatum = '\0';

CodeParser::CodeParser(const CodeState* initialState, Context* c)
    : itsState(initialState), itsInitialState(initialState), itsContext(c),
      itsPosition(0), itsMarkedPosition(-1)
{}

void CodeParser::Process(Datum d)
{
    CodeState::const_iterator effectIter( itsState->find(d) );
    CodeState::const_iterator notFound( itsState->end() );
    if (    notFound != effectIter
         || notFound != (effectIter = itsState->find(cDefaultDatum)) ) {
        const CodeEffect& effect = (*effectIter).second;
        if (effect.markPosition)
            itsMarkedPosition = itsPosition;
        if (effect.action != 0 && itsContext)
            (itsContext->*effect.action)(itsMarkedPosition);
        if (effect.next)
            itsState = effect.next;
    }
    ++itsPosition;
}

void CodeParser::Process(const Datum* data, Position length)
{ while (length--) Process(*data++); }

void CodeParser::ResetPosition(Position newPosition)
{
    Position d = itsPosition - itsMarkedPosition;
    itsPosition = newPosition;
    itsMarkedPosition = newPosition - d;
}

void CodeParser::ResetState(const CodeState* newState)
{
    itsState = newState ? newState : itsInitialState;
}

#ifndef NDEBUG
const char* CodeParser::CurrentState()
{
    return itsState->itsName;
}
#endif // NDEBUG

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?