};
struct CYThing {
- virtual void Output(std::ostream &out) const = 0;
+ virtual void Output(struct CYOutput &out) const = 0;
};
-_finline std::ostream &operator <<(std::ostream &out, const CYThing &rhs) {
- rhs.Output(out);
- return out;
-}
+struct CYOutput {
+ std::ostream &out_;
+
+ CYOutput(std::ostream &out) :
+ out_(out)
+ {
+ }
+
+ _finline CYOutput &operator <<(char rhs) {
+ out_ << rhs;
+ return *this;
+ }
+
+ _finline CYOutput &operator <<(const char *rhs) {
+ out_ << rhs;
+ return *this;
+ }
+
+ _finline CYOutput &operator <<(const CYThing &rhs) {
+ rhs.Output(*this);
+ return *this;
+ }
+};
struct CYSource :
CYNext<CYSource>
{
- virtual void Show(std::ostream &out) const;
- virtual void Output(std::ostream &out) const = 0;
- virtual void Output(std::ostream &out, bool block) const;
+ virtual bool IsBlock() const {
+ return next_ != NULL;
+ }
+
+ virtual void Show(CYOutput &out) const;
+ virtual void Output(CYOutput &out) const = 0;
+ virtual void Output(CYOutput &out, bool block) const;
+ virtual void Output_(CYOutput &out) const;
};
struct CYPropertyName {
- virtual void PropertyName(std::ostream &out) const = 0;
+ virtual void PropertyName(CYOutput &out) const = 0;
};
struct CYClassName {
- virtual void ClassName(std::ostream &out) const = 0;
+ virtual void ClassName(CYOutput &out, bool object) const = 0;
};
struct CYWord :
return word_;
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
- virtual void ClassName(std::ostream &out) const;
- virtual void PropertyName(std::ostream &out) const;
+ virtual void ClassName(CYOutput &out, bool object) const;
+ virtual void PropertyName(CYOutput &out) const;
};
+_finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
+ return lhs << rhs.Value();
+}
+
struct CYIdentifier :
CYWord
{
struct CYLabel :
CYNext<CYLabel>
{
- CYIdentifier *identifier_;
+ CYIdentifier *name_;
- CYLabel(CYIdentifier *identifier, CYLabel *next) :
+ CYLabel(CYIdentifier *name, CYLabel *next) :
CYNext<CYLabel>(next),
- identifier_(identifier)
+ name_(name)
{
}
};
struct CYStatement :
CYSource
{
- CYLabel *label_;
+ CYLabel *labels_;
+
+ CYStatement() :
+ labels_(NULL)
+ {
+ }
void AddLabel(CYIdentifier *identifier) {
- label_ = new CYLabel(identifier, label_);
+ labels_ = new CYLabel(identifier, labels_);
}
+
+ virtual void Output_(CYOutput &out) const;
+};
+
+struct CYBlock :
+ CYStatement
+{
+ CYStatement *statements_;
+
+ CYBlock(CYStatement *statements) :
+ statements_(statements)
+ {
+ }
+
+ virtual bool IsBlock() const {
+ return true;
+ }
+
+ virtual void Output(CYOutput &out) const;
};
enum CYState {
size_t size_;
FILE *file_;
+ enum Condition {
+ RegExStart,
+ RegExRest
+ };
+
std::string filename_;
struct Error {
public:
CYDriver(const std::string &filename);
~CYDriver();
-};
-
-struct CYPart {
- virtual void Part(std::ostream &out) const = 0;
-};
-
-struct CYForInitialiser :
- CYPart
-{
-};
-struct CYForInInitialiser :
- CYPart
-{
+ void SetCondition(Condition condition);
};
enum CYFlags {
CYNoTrailer = (1 << 3),
CYNoIn = (1 << 4),
CYNoHyphen = (1 << 5),
+ CYNoBF = (CYNoBrace | CYNoFunction),
+};
+
+struct CYForInitialiser {
+ virtual void For(CYOutput &out) const = 0;
+};
+
+struct CYForInInitialiser {
+ virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
+ virtual const char *ForEachIn() const = 0;
+ virtual void ForEachIn(CYOutput &out) const = 0;
};
struct CYExpression :
CYClassName
{
virtual unsigned Precedence() const = 0;
- virtual void Part(std::ostream &out) const;
- virtual void Output(std::ostream &out, CYFlags flags) const = 0;
- void Output(std::ostream &out, unsigned precedence, CYFlags flags) const;
- virtual void ClassName(std::ostream &out) const;
+ virtual void For(CYOutput &out) const;
+ virtual void ForIn(CYOutput &out, CYFlags flags) const;
+
+ virtual const char *ForEachIn() const;
+ virtual void ForEachIn(CYOutput &out) const;
+
+ virtual void Output(CYOutput &out, CYFlags flags) const = 0;
+ void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
+
+ virtual void ClassName(CYOutput &out, bool object) const;
virtual const char *Word() const {
return NULL;
CYPrecedence(17)
- void Output(std::ostream &out, CYFlags flags) const;
+ void Output(CYOutput &out, CYFlags flags) const;
+};
+
+struct CYComprehension :
+ CYNext<CYComprehension>
+{
+ void Output(CYOutput &out) const;
+ virtual const char *Name() const = 0;
+
+ virtual void Begin_(CYOutput &out) const = 0;
+
+ virtual void End_(CYOutput &out) const {
+ }
+};
+
+struct CYForInComprehension :
+ CYComprehension
+{
+ CYIdentifier *name_;
+ CYExpression *set_;
+
+ CYForInComprehension(CYIdentifier *name, CYExpression *set) :
+ name_(name),
+ set_(set)
+ {
+ }
+
+ virtual const char *Name() const {
+ return name_->Value();
+ }
+
+ virtual void Begin_(CYOutput &out) const;
+};
+
+struct CYForEachInComprehension :
+ CYComprehension
+{
+ CYIdentifier *name_;
+ CYExpression *set_;
+
+ CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
+ name_(name),
+ set_(set)
+ {
+ }
+
+ virtual const char *Name() const {
+ return name_->Value();
+ }
+
+ virtual void Begin_(CYOutput &out) const;
+ virtual void End_(CYOutput &out) const;
+};
+
+struct CYIfComprehension :
+ CYComprehension
+{
+ CYExpression *test_;
+
+ CYIfComprehension(CYExpression *test) :
+ test_(test)
+ {
+ }
+
+ virtual const char *Name() const {
+ return NULL;
+ }
+
+ virtual void Begin_(CYOutput &out) const;
+};
+
+struct CYArrayComprehension :
+ CYExpression
+{
+ CYExpression *expression_;
+ CYComprehension *comprehensions_;
+
+ CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
+ expression_(expression),
+ comprehensions_(comprehensions)
+ {
+ }
+
+ CYPrecedence(0)
+
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYLiteral :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYSelector :
CYPrecedence(1)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYRange {
return Value();
}
- virtual void Output(std::ostream &out) const {
+ virtual void Output(CYOutput &out) const {
return Output(out, CYNoFlags);
}
- virtual void Output(std::ostream &out, CYFlags flags) const;
- virtual void PropertyName(std::ostream &out) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+ virtual void PropertyName(CYOutput &out) const;
};
struct CYNumber :
return value_;
}
- virtual void Output(std::ostream &out) const {
+ virtual void Output(CYOutput &out) const {
return Output(out, CYNoFlags);
}
- virtual void Output(std::ostream &out, CYFlags flags) const;
- virtual void PropertyName(std::ostream &out) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+ virtual void PropertyName(CYOutput &out) const;
+};
+
+struct CYRegEx :
+ CYLiteral
+{
+ const char *value_;
+
+ CYRegEx(const char *value) :
+ value_(value)
+ {
+ }
+
+ const char *Value() const {
+ return value_;
+ }
+
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYNull :
{
}
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYThis :
{
}
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYBoolean :
CYLiteral
{
virtual bool Value() const = 0;
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYFalse :
CYPrecedence(0)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYPrefix :
virtual bool Alphabetic() const = 0;
virtual const char *Operator() const = 0;
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYInfix :
virtual bool Alphabetic() const = 0;
virtual const char *Operator() const = 0;
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYPostfix :
virtual const char *Operator() const = 0;
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYAssignment :
virtual const char *Operator() const = 0;
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYArgument :
{
}
- void Output(std::ostream &out) const;
+ void Output(CYOutput &out) const;
};
struct CYBlank :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYElement :
{
}
- void Output(std::ostream &out) const;
+ void Output(CYOutput &out) const;
};
struct CYArray :
{
}
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYDeclaration :
- CYThing,
CYForInInitialiser
{
CYIdentifier *identifier_;
{
}
- virtual void Part(std::ostream &out) const;
- virtual void Output(std::ostream &out) const;
+ virtual void ForIn(CYOutput &out, CYFlags flags) const;
+
+ virtual const char *ForEachIn() const;
+ virtual void ForEachIn(CYOutput &out) const;
+
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYDeclarations :
- CYStatement,
+ CYNext<CYDeclarations>,
CYForInitialiser
{
CYDeclaration *declaration_;
- CYDeclarations *next_;
CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
- declaration_(declaration),
- next_(next)
+ CYNext<CYDeclarations>(next),
+ declaration_(declaration)
+ {
+ }
+
+ virtual void For(CYOutput &out) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
+struct CYVar :
+ CYStatement
+{
+ CYDeclarations *declarations_;
+
+ CYVar(CYDeclarations *declarations) :
+ declarations_(declarations)
+ {
+ }
+
+ virtual void Output(CYOutput &out) const;
+};
+
+struct CYLet :
+ CYStatement
+{
+ CYDeclarations *declarations_;
+ CYStatement *statements_;
+
+ CYLet(CYDeclarations *declarations, CYStatement *statements) :
+ declarations_(declarations),
+ statements_(statements)
{
}
- virtual void Part(std::ostream &out) const;
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYField :
CYNext<CYField>
{
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYMessageParameter :
{
}
- virtual void Output(std::ostream &out, bool replace) const;
+ virtual void Output(CYOutput &out, bool replace) const;
};
struct CYClass :
- CYSource
+ CYExpression,
+ CYStatement
{
- CYIdentifier *name_;
+ CYClassName *name_;
CYExpression *super_;
CYField *fields_;
CYMessage *messages_;
- CYClass(CYIdentifier *name, CYExpression *super, CYField *fields, CYMessage *messages) :
+ CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
name_(name),
super_(super),
fields_(fields),
{
}
- virtual void Output(std::ostream &out) const;
+ CYPrecedence(0)
+
+ virtual void Output(CYOutput &out) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYCategory :
- CYSource
+ CYStatement
{
CYClassName *name_;
CYMessage *messages_;
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYFunctionParameter :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYFor :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYForIn :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
+};
+
+struct CYForEachIn :
+ CYStatement
+{
+ CYForInInitialiser *initialiser_;
+ CYExpression *set_;
+ CYStatement *code_;
+
+ CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
+ initialiser_(initialiser),
+ set_(set),
+ code_(code)
+ {
+ }
+
+ virtual void Output(CYOutput &out) const;
};
struct CYProperty :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYObject :
{
}
- void Output(std::ostream &out, CYFlags flags) const;
+ void Output(CYOutput &out, CYFlags flags) const;
};
struct CYCatch :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYSend :
CYPrecedence(0)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYMember :
CYPrecedence(1)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYIndirectMember :
CYPrecedence(1)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYNew :
CYPrecedence(1)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYCall :
CYPrecedence(2)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYIf :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYDoWhile :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYWhile :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYLambda :
CYPrecedence(0)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYFunction :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYExpress :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYContinue :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYBreak :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYReturn :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYEmpty :
CYStatement
{
- virtual void Output(std::ostream &out) const;
- virtual void Output(std::ostream &out, bool block) const;
+ virtual void Output(CYOutput &out) const;
+ virtual void Output(CYOutput &out, bool block) const;
};
struct CYTry :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYThrow :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYWith :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYSwitch :
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(CYOutput &out) const;
};
struct CYCondition :
CYPrecedence(15)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYAddressOf :
CYAlphabetic(false)
CYPrecedence(2)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYIndirect :
CYAlphabetic(false)
CYPrecedence(1)
- virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void Output(CYOutput &out, CYFlags flags) const;
};
#define CYPostfix_(op, name) \