kolibrios/contrib/media/updf/include/infixparser.h

140 lines
3.6 KiB
C
Raw Normal View History

/** \file infixparser.h
* parsing and printing in the infix style.
*
*/
#ifndef __infixparser_h__
#define __infixparser_h__
#include "yacasbase.h"
#include "lispparser.h"
#define KMaxPrecedence 60000
class LispInFixOperator : public YacasBase
{
public:
inline LispInFixOperator(LispInt aPrecedence)
: iPrecedence(aPrecedence),
iLeftPrecedence(aPrecedence),
iRightPrecedence(aPrecedence),
iRightAssociative(0)
{};
inline void SetRightAssociative(void)
{
iRightAssociative = 1;
}
inline void SetLeftPrecedence(LispInt aPrecedence)
{
iLeftPrecedence = aPrecedence;
}
inline void SetRightPrecedence(LispInt aPrecedence)
{
iRightPrecedence = aPrecedence;
}
public:
LispInt iPrecedence;
LispInt iLeftPrecedence;
LispInt iRightPrecedence;
LispInt iRightAssociative;
};
class LispOperators : public LispAssociatedHash<LispInFixOperator>
{
public:
void SetOperator(LispInt aPrecedence,LispString * aString);
void SetRightAssociative(LispString * aString);
void SetLeftPrecedence(LispString * aString,LispInt aPrecedence);
void SetRightPrecedence(LispString * aString,LispInt aPrecedence);
};
class InfixParser : public LispParser
{
public:
InfixParser(LispTokenizer& aTokenizer, LispInput& aInput,
LispEnvironment& aEnvironment,
LispOperators& aPrefixOperators,
LispOperators& aInfixOperators,
LispOperators& aPostfixOperators,
LispOperators& aBodiedOperators);
~InfixParser();
virtual void Parse(LispPtr& aResult);
//private:
void ParseCont(LispPtr& aResult);
public:
LispOperators& iPrefixOperators;
LispOperators& iInfixOperators;
LispOperators& iPostfixOperators;
LispOperators& iBodiedOperators;
// LispEnvironment* iEnvironment;
};
class ParsedObject : public YacasBase
{
public:
ParsedObject(InfixParser& aParser)
: iParser(aParser),
iError(LispFalse),
iEndOfFile(LispFalse),
iLookAhead(NULL),iResult() {};
void Parse();
private:
void ReadToken();
void MatchToken(LispString * aToken);
void ReadExpression(LispInt depth);
void ReadAtom();
private:
void GetOtherSide(LispInt aNrArgsToCombine, LispInt depth);
void Combine(LispInt aNrArgsToCombine);
void InsertAtom(LispString * aString);
private:
void Fail(); // called when parsing fails, raising an exception
private:
InfixParser& iParser;
private:
LispBoolean iError;
LispBoolean iEndOfFile;
LispString * iLookAhead;
public:
LispPtr iResult;
};
class InfixPrinter : public LispPrinter
{
public:
InfixPrinter(LispOperators& aPrefixOperators,
LispOperators& aInfixOperators,
LispOperators& aPostfixOperators,
LispOperators& aBodiedOperators)
: iPrefixOperators(aPrefixOperators),
iInfixOperators(aInfixOperators),
iPostfixOperators(aPostfixOperators),
iBodiedOperators(aBodiedOperators),
iPrevLastChar(0),iCurrentEnvironment(NULL){}
virtual void Print(LispPtr& aExpression, LispOutput& aOutput,
LispEnvironment& aEnvironment);
virtual void RememberLastChar(LispChar aChar);
private:
void Print(LispPtr& aExpression, LispOutput& aOutput,
LispInt iPrecedence);
void WriteToken(LispOutput& aOutput,LispChar * aString);
private:
LispOperators& iPrefixOperators;
LispOperators& iInfixOperators;
LispOperators& iPostfixOperators;
LispOperators& iBodiedOperators;
LispChar iPrevLastChar;
LispEnvironment* iCurrentEnvironment;
};
#endif