ot_tran.cpp
来自「在手机操作系统symbina上使用的一个脚本扩展语言的代码实现,可以参考用于自己」· C++ 代码 · 共 306 行
CPP
306 行
// OT_TRAN.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd. All rights reserved.
//
// The top level interface to the OPL translator
//
#include "ot_std.h"
#include "opl16.h"
LOCAL_C TInt processTranError(TInt ret,TTranslateError& anError)
//
// checks the return value from a translator. Converts translator errors
// into KErrGeneral
//
{
anError.SetError(ret);
return (ret>0 ? KErrGeneral : ret);
}
// First export - the interface required by Program editors
EXPORT_C COplTranslatorBase *NewTranslatorL()
{
return COplModuleTranslator::NewL();
}
//////////////////////////////////////////////////////////////
//
// COplModuleTranslator
//
/////////////////////////////////////////////////////////////
EXPORT_C COplModuleTranslator::~COplModuleTranslator()
//
// Delete all the components of the translator
//
{
delete iLexer;
delete iParser;
if (iOwnBackEnd)
delete iBackEnd;
}
EXPORT_C COplModuleTranslator* COplModuleTranslator::NewL()
//
// Creates a new OPL translator and leaves if there is an error
//
{
COplModuleTranslator *pT=NewLC();
CleanupStack::Pop();
return pT;
}
EXPORT_C COplModuleTranslator* COplModuleTranslator::NewLC()
//
// Creates a new opl translator leaving it on the cleanup stack
//
{
COplModuleTranslator *pT=new(ELeave) COplModuleTranslator();
CleanupStack::PushL(pT);
pT->ConstructL();
return pT;
}
EXPORT_C void COplModuleTranslator::SetAppCB(MTranAppCB *anAppCB)
{
iAppCB=anAppCB;
}
LOCAL_C void DoCancel(TAny *This)
//
//
//
{
((COplModuleTranslator *)This)->Cancel();
}
EXPORT_C void COplModuleTranslator::StartTranslateL(
MTextSourceSystem& aTextSystem,
const TFileName& aSourceName,
COplModuleBackEnd& aBackEnd,
CTextTranslator::TDebugFlag aDebugFlag,
TSourceTranslateError& anError)
//
// Initializes everything for translating, using a passed back end to do the output.
//
{
// In case anything goes wrong
CleanupStack::PushL(TCleanupItem(DoCancel,this));
// record the fact that we're just borrowing the back end.
iBackEnd=&aBackEnd;
iOwnBackEnd=EFalse;
CommonStartL(aTextSystem, aSourceName,aDebugFlag,anError);
}
EXPORT_C void COplModuleTranslator::StartTranslateL(
MTextSourceSystem& aTextSystem,
const TFileName& aSourceName,
const TFileName& aTargetName,
CTextTranslator::TDebugFlag aDebugFlag,
TSourceTranslateError& anError)
//
// Initializes everything for translating
//
{
// In case anything goes wrong
CleanupStack::PushL(TCleanupItem(DoCancel,this));
// Make sure that we have got a translator BackEnd
switch (iParser->Target())
{
case EOplTargetOpl1993:
iBackEnd=COpl16Opl1993BackEnd::NewL(aTargetName,iAppCB);
break;
case EOplTargetER1:
iBackEnd=COpl16Opler1BackEnd::NewL(aTargetName,iAppCB);
break;
default:
Panic(EOpltUnknownTranTarget);
}
iOwnBackEnd=ETrue;
CommonStartL(aTextSystem,aSourceName,aDebugFlag,anError);
}
EXPORT_C void COplModuleTranslator::LocateErrorL(
MTextSourceSystem& aTextSystem,
const TFileName& aSourceName,
const TFileName& aTargetName,
CTextTranslator::TDebugFlag aDebugFlag,
TSourceTranslateError& anError,
TInt aLineNumber)
{
StartTranslateL(aTextSystem,aSourceName,aTargetName,aDebugFlag,anError);
iParser->SetErrorLocation(aLineNumber, anError.Position());
}
void COplModuleTranslator::CommonStartL(MTextSourceSystem& aTextSystem,
const TFileName& aSourceName,
CTextTranslator::TDebugFlag aDebugFlag,
TSourceTranslateError& anError)
{
// Open up the source file
iLexer->OpenL(aTextSystem,aSourceName,anError);
// Set things up for error tracking
iBackEnd->StartL(aSourceName,aDebugFlag,anError);
// And finally start the parser
iParser->Start(*iLexer,anError,*iBackEnd);
// Where to put the error value
iError=&anError;
CleanupStack::Pop(); // Cancel code
}
EXPORT_C TInt COplModuleTranslator::TranslateChunk()
//
// Next step in the module translation
//
{
TRAPD(ret,iParser->ParseChunkL());
ret=processTranError(ret,*(TTranslateError*)iError);
if (ret!=KErrNone)
Cancel();
return ret;
}
EXPORT_C void COplModuleTranslator::Cancel()
//
// Resets everything
//
{
iParser->Reset();
iLexer->Reset();
if (iOwnBackEnd)
delete iBackEnd;
iBackEnd=NULL;
iError=NULL;
}
EXPORT_C void COplModuleTranslator::SetTarget(TOplTranTarget aTarget)
//
// Sets the target for subsequent tarnslations.
//
{
iParser->SetTarget(aTarget); // This will PANIC is this is an inappriate time to SetTarget
iLexer->SetTarget(aTarget);
}
void COplModuleTranslator::ConstructL()
//
// Constructs all the bits
//
{
iLexer=COplModuleLexer::NewL();
iParser=COplModuleParser::NewL();
}
//////////////////////////////////////////////////////////////////
//
// COplEvalTranslator
//
//////////////////////////////////////////////////////////////////
EXPORT_C COplEvalTranslator::~COplEvalTranslator()
//
// deletes all the constituent parts
//
{
delete iParser;
delete iBackEnd;
delete iLexer;
}
EXPORT_C COplEvalTranslator *COplEvalTranslator::NewL()
//
// Safely constructs one
//
{
COplEvalTranslator *pT=NewLC();
CleanupStack::Pop();
return pT;
}
EXPORT_C COplEvalTranslator *COplEvalTranslator::NewLC()
//
// constructs one leaving it on the cleaup stack
//
{
COplEvalTranslator *pT=new(ELeave) COplEvalTranslator;
CleanupStack::PushL(pT);
pT->ConstructL();
return pT;
}
EXPORT_C TInt COplEvalTranslator::Translate(const TDesC& anExpression,
TTranslateError& anError,
CBufBase& aQcode,TInt &aMaxStackDepth)
//
// Translates the expression
//
{
iLexer->SetExpression(anExpression);
iLexer->SetError(&anError);
iBackEnd->SetBuffers(anError,aQcode,aMaxStackDepth);
TRAPD(ret,iParser->ParseExpressionL(*iLexer,anError,*iBackEnd));
return processTranError(ret,anError);
}
EXPORT_C TInt COplEvalTranslator::LocateError(const TDesC& /* anExpression*/, TTranslateError& anError)
//
// Tries to locate the positon of an error - FOR NOW
//
{
anError.SetPosition(0);
return KErrNone;
}
void COplEvalTranslator::ConstructL()
//
// Gets all the constituent parts
//
{
iLexer=COplLineLexer::NewL();
iParser=COplEvalParser::NewL();
iBackEnd=COpl16EvalBackEnd::NewL();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?