LRDE Tiger Compiler  1.34a $Id: 7fef12e1f5fa43449d667a0eec1d837c40fc1202 $
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
desugar::DesugarVisitor Class Reference

Desugar some syntactic structures while duplicating an Ast. More...

#include <desugar-visitor.hh>

Inheritance diagram for desugar::DesugarVisitor:
Collaboration diagram for desugar::DesugarVisitor:

Public Types

typedef astclone::Cloner super_type
 Superclass.

Public Member Functions

 DesugarVisitor (bool desugar_for_p, bool desugar_string_cmp_p)
 Build a DesugarVisitor.
virtual ~DesugarVisitor ()
 Destroy a DesugarVisitor.
ast::Astresult_get ()
template<typename T >
T * recurse (const T &t)
template<typename T >
T * recurse (const T *const t)
template<typename CollectionType >
CollectionType * recurse_collection (const CollectionType &c)
 Clone a collection object.
virtual void operator() (const ast::ArrayExp &) override
virtual void operator() (const ast::ArrayTy &) override
virtual void operator() (const ast::AssignExp &) override
virtual void operator() (const ast::BreakExp &) override
virtual void operator() (const ast::CallExp &) override
virtual void operator() (const ast::CastExp &) override
virtual void operator() (const ast::CastVar &) override
virtual void operator() (const ast::ClassTy &) override
virtual void operator() (const ast::DecsList &) override
virtual void operator() (const ast::Field &) override
virtual void operator() (const ast::FieldInit &) override
virtual void operator() (const ast::FieldVar &) override
virtual void operator() (const ast::FunctionDec &) override
virtual void operator() (const ast::IfExp &) override
virtual void operator() (const ast::IntExp &) override
virtual void operator() (const ast::LetExp &) override
virtual void operator() (const ast::MethodCallExp &) override
virtual void operator() (const ast::MethodDec &) override
virtual void operator() (const ast::NameTy &) override
virtual void operator() (const ast::NilExp &) override
virtual void operator() (const ast::ObjectExp &) override
virtual void operator() (const ast::RecordExp &) override
virtual void operator() (const ast::RecordTy &) override
virtual void operator() (const ast::SeqExp &) override
virtual void operator() (const ast::SimpleVar &) override
virtual void operator() (const ast::StringExp &) override
virtual void operator() (const ast::SubscriptVar &) override
virtual void operator() (const ast::TypeDec &) override
virtual void operator() (const ast::VarDec &) override
virtual void operator() (const ast::WhileExp &) override
virtual void operator() (const ast::FunctionDecs &) override
virtual void operator() (typename Const< Ast >::type &e)
 The entry point: visit e.
virtual void operator() (typename Const< ClassTy >::type &)=0
virtual void operator() (typename Const< MethodCallExp >::type &)=0
virtual void operator() (typename Const< MethodDec >::type &)=0
virtual void operator() (typename Const< ObjectExp >::type &)=0
template<class E >
void operator() (E *e)
 Helper to visit nodes manipulated via a pointer.
template<typename DecsType >
void decs_visit (const DecsType &e)
 Visit a chunk (i.e., a list of Function, Var, and Type decs).
Visit methods.
virtual void operator() (const ast::OpExp &) override
 Desugar string comparisons.
virtual void operator() (const ast::ForExp &) override
 Desugar `for' loops as `while' loops.
Visit Variable related nodes.
virtual void operator() (typename Const< SimpleVar >::type &e) override
virtual void operator() (typename Const< FieldVar >::type &e) override
virtual void operator() (typename Const< SubscriptVar >::type &e) override
virtual void operator() (typename Const< CastVar >::type &e) override
Visit Expression related nodes.
virtual void operator() (typename Const< NilExp >::type &e) override
virtual void operator() (typename Const< IntExp >::type &e) override
virtual void operator() (typename Const< StringExp >::type &e) override
virtual void operator() (typename Const< CallExp >::type &e) override
virtual void operator() (typename Const< OpExp >::type &e) override
virtual void operator() (typename Const< RecordExp >::type &e) override
virtual void operator() (typename Const< SeqExp >::type &e) override
virtual void operator() (typename Const< AssignExp >::type &e) override
virtual void operator() (typename Const< IfExp >::type &e) override
virtual void operator() (typename Const< WhileExp >::type &e) override
virtual void operator() (typename Const< ForExp >::type &e) override
virtual void operator() (typename Const< BreakExp >::type &) override
virtual void operator() (typename Const< LetExp >::type &e) override
virtual void operator() (typename Const< ArrayExp >::type &e) override
virtual void operator() (typename Const< CastExp >::type &e) override
virtual void operator() (typename Const< FieldInit >::type &e) override
Visit Declaration related nodes.

Visiting declarations is simple, but there are many clauses. This is because in Tiger, the declarations are processed by chunks (a chunk of Function declarations, then Var or Type, then ...). So we have to explain

  • How to visit a list of chunks;
  • how to visit chunks of function, var, or type declarations;
  • how to visit a single function, var, or type declaration.
virtual void operator() (typename Const< DecsList >::type &e) override
 Visit a list of function, type and/or variables declarations.
virtual void operator() (typename Const< Decs >::type &e)
 Visit a Decs chunks.
virtual void operator() (typename Const< VarDecs >::type &e) override
 Visit Var declarations.
virtual void operator() (typename Const< VarDec >::type &e) override
virtual void operator() (typename Const< FunctionDec >::type &e) override
virtual void operator() (typename Const< TypeDec >::type &e) override
template<typename DecsType >
void decs_visit (typename Const< DecsType >::type &e)
 Visit a chunk (i.e., a list of Function, Var, and Type decs).
Visit Type related nodes.
virtual void operator() (typename Const< NameTy >::type &e) override
virtual void operator() (typename Const< RecordTy >::type &e) override
virtual void operator() (typename Const< ArrayTy >::type &e) override
Visit Field related nodes.
virtual void operator() (typename Const< Field >::type &e) override

Protected Member Functions

template<typename E >
void accept (E *e)

Protected Attributes

ast::Astresult_
 The cloned Ast.

Private Attributes

bool desugar_for_p_
 Desugar `for' loops?
bool desugar_string_cmp_p_
 Desugar string comparisons?

Detailed Description

Desugar some syntactic structures while duplicating an Ast.

Member Typedef Documentation

Constructor & Destructor Documentation

desugar::DesugarVisitor::DesugarVisitor ( bool  desugar_for_p,
bool  desugar_string_cmp_p 
)

Build a DesugarVisitor.

desugar::DesugarVisitor::~DesugarVisitor ( )
virtual

Destroy a DesugarVisitor.

Member Function Documentation

template<template< typename > class Const>
template<typename E >
void ast::GenVisitor< Const >::accept ( E *  e)
protectedinherited

A convenient shortcut for recurring code like this:

if (e)
e->accept(*this);

However, the drawback of this approach is that it doesn't take care of the constness, and any const violation will be reported within the body of this method, not at its corresponding call site.

We cannot use the misc/select_const.hh approach here, since the compiler cannot resolve a function overloaded or specialized on an associated type of a template. E.g., writing accept like this:

template <typename E>
void accept(typename Const<E>::type* e);

won't work directly. Of course, one can help the compiler, providing it with E

accept<ast::NameTy>(e.result_get());

but this is painful.

template<typename DecsType >
void astclone::Cloner::decs_visit ( const DecsType &  e)
inherited

Visit a chunk (i.e., a list of Function, Var, and Type decs).

It is exactly the same in the three cases, so the code is factored via a template method.

References assertion.

template<template< typename > class Const>
template<typename DecsType >
void ast::GenDefaultVisitor< Const >::decs_visit ( typename Const< DecsType >::type &  e)
inlineinherited

Visit a chunk (i.e., a list of Function, Var, and Type decs).

It is exactly the same in the three cases, so the code is factored via a template method.

virtual void desugar::DesugarVisitor::operator() ( const ast::OpExp )
overridevirtual

Desugar string comparisons.

Reimplemented from astclone::Cloner.

template<template< typename > class Const>
virtual void ast::GenVisitor< Const >::operator() ( typename Const< ClassTy >::type &  )
pure virtualinherited
virtual void desugar::DesugarVisitor::operator() ( const ast::ForExp )
overridevirtual

Desugar `for' loops as `while' loops.

Reimplemented from astclone::Cloner.

template<template< typename > class Const>
virtual void ast::GenVisitor< Const >::operator() ( typename Const< MethodCallExp >::type &  )
pure virtualinherited
template<template< typename > class Const>
virtual void ast::GenVisitor< Const >::operator() ( typename Const< MethodDec >::type &  )
pure virtualinherited
template<template< typename > class Const>
virtual void ast::GenVisitor< Const >::operator() ( typename Const< ObjectExp >::type &  )
pure virtualinherited
void astclone::Cloner::operator() ( const ast::ArrayExp &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::ArrayTy e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::AssignExp &  e)
overridevirtualinherited

Reimplemented in object::DesugarVisitor.

void astclone::Cloner::operator() ( const ast::BreakExp &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< Ast >::type &  e)
virtualinherited
void astclone::Cloner::operator() ( const ast::CallExp &  e)
overridevirtualinherited

Reimplemented in object::DesugarVisitor.

void astclone::Cloner::operator() ( const ast::CastExp e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::CastVar e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::ClassTy e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< SimpleVar >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::DecsList e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::Field e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< FieldVar >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::FieldInit e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< SubscriptVar >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::FieldVar &  e)
overridevirtualinherited

Reimplemented in object::DesugarVisitor.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< CastVar >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::IfExp &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::IntExp e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::LetExp &  e)
overridevirtualinherited
template<template< typename > class Const>
template<class E >
void ast::GenVisitor< Const >::operator() ( E *  e)
inherited

Helper to visit nodes manipulated via a pointer.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< NilExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::MethodCallExp &  e)
overridevirtualinherited

Reimplemented in object::DesugarVisitor.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< IntExp >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< StringExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::NameTy e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< CallExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::NilExp e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< OpExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::ObjectExp &  e)
overridevirtualinherited

Reimplemented in object::DesugarVisitor.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< RecordExp >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< SeqExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::RecordExp &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< AssignExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::RecordTy &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< IfExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::SeqExp &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< WhileExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::SimpleVar e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::StringExp &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< ForExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::SubscriptVar e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< BreakExp >::type &  )
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::TypeDec e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< LetExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::VarDec e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< ArrayExp >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::WhileExp e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< CastExp >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< FieldInit >::type &  e)
overridevirtualinherited
void astclone::Cloner::operator() ( const ast::FunctionDecs e)
overridevirtualinherited

Reimplemented in object::DesugarVisitor.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< DecsList >::type &  e)
overridevirtualinherited

Visit a list of function, type and/or variables declarations.

Implements ast::GenVisitor< Const >.

References misc::for_each().

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< Decs >::type &  e)
virtualinherited

Visit a Decs chunks.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< VarDecs >::type &  e)
overridevirtualinherited

Visit Var declarations.

Implements ast::GenVisitor< Const >.

template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< VarDec >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< FunctionDec >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< TypeDec >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< NameTy >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< RecordTy >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< ArrayTy >::type &  e)
overridevirtualinherited
template<template< typename > class Const>
void ast::GenDefaultVisitor< Const >::operator() ( typename Const< Field >::type &  e)
overridevirtualinherited
template<typename T >
T * astclone::Cloner::recurse ( const T &  t)
inherited
template<typename T >
T * astclone::Cloner::recurse ( const T *const  t)
inherited

References assertion.

template<typename CollectionType >
CollectionType * astclone::Cloner::recurse_collection ( const CollectionType &  c)
inherited

Clone a collection object.

Using overloading for this method is tempting, but it would lead to the same prototype than the first recurse method.

A partial specialization for std::list<T> would work, but is not allowed by C++ standard. As a consequence, we are stuck to using different names.

References assertion.

Referenced by astclone::Cloner::operator()().

Member Data Documentation

bool desugar::DesugarVisitor::desugar_for_p_
private

Desugar `for' loops?

bool desugar::DesugarVisitor::desugar_string_cmp_p_
private

Desugar string comparisons?

ast::Ast* astclone::Cloner::result_
protectedinherited

The documentation for this class was generated from the following files: