Language::Tea - A Tea code converter.


Language-Tea documentation Contained in the Language-Tea distribution.

Index


Code Index:

NAME

Top

Language::Tea - A Tea code converter.

VERSION

Top

Version 0.03

SYNOPSIS

Top

This module converts Tea code into Java.

syntax:

    destea.pl filename [option]

- filename: The Tea file you want to convert.

- option: put any character after the filename if you want destea to print directly to file. This will create a directory named 'Project' with a file MainProgram.java and other files for each class in the Tea file converted.

DESCRIPTION

Top

destea will convert Tea code to Java. You have two options: - You can print Java code to standard output; - Or, you can print Java code directly to java files. If you want to use this, you just have to put any character after the filename

Example: ./destea.pl example.java a

This will create a new directory called 'Project' and inside you'll have MainProgram.java, wich contains all main Tea instructions, and you'll have another files, one for each class in your Tea file converted.

Example: Imagine you have a Tea file with two classes: Triangle and Rectangle. If you convert this file, you'll obtain MainProgram.java, Triangle.java and Rectangle.java

AUTHOR

Top

Mario Silva <mario.silva at verticalone.pt>

Flavio Glock <flavio.glock@verticalone.pt>

Daniel Ruoso <daniel.ruoso@verticalone.pt>

BUGS

Top

Please report any bugs or feature requests to bug-language-tea at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Language-Tea. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Language-Tea

* CPAN Ratings

http://cpanratings.perl.org/d/Language-Tea

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=Language-Tea

* Search CPAN

http://search.cpan.org/dist/Language-Tea

COPYRIGHT & LICENSE

Top


Language-Tea documentation Contained in the Language-Tea distribution.
package Language::Tea;

use warnings;
use strict;

use lib ( 'lib', '../lib' );

use Language::Tea::Traverse;
use Language::Tea::Grammar;
use Language::Tea::Pad;
use Language::Tea::Match2AST;
use Language::Tea::AST2Objects;
use Language::Tea::NodeUpLinker;
use Language::Tea::StatementContext;
use Language::Tea::ASTRefactor;
use Language::Tea::StaticType;
use Language::Tea::JavaEmitter;
use Language::Tea::Function;
 
our $VERSION = '0.03';
our %Classes;
our $root;

sub translate {
    my $source_code= shift; 
    my $filename = shift;
    my @source_lines = shift;

    my $Env = Language::Tea::Pad->new();
    Language::Tea::Function::init_prototypes( $Env );

    $source_code =~ s/{/ { /g;
    $source_code =~ s/\(/ \( /g;
    $source_code =~ s/\)/ \) /g;
    
    my $match = Language::Tea::Grammar->statements( $source_code );
    my $ast = Language::Tea::Match2AST::match2ast( $match, $filename, \@source_lines );
    $root = Language::Tea::AST2Objects::ast2objects( $ast );

    Language::Tea::NodeUpLinker::create_links( $root );
    Language::Tea::StatementContext::annotate_context( $root );
    Language::Tea::ASTRefactor::refactor( $root );
    $root = Language::Tea::StaticType::annotate_types($root, $Env);
    {
        my $i = 0;
        while ( $i < @{ $root->{statement} } ) {
            my $node = $root->{statement}[$i];
            if ( ref( $node ) eq 'TeaPart::Class' ) {
                my $class = $node->{class}{arg_symbol};
                $Classes{$class} ||= $node;  # XXX
                splice @{ $root->{statement} }, $i, 1;
            }
            elsif ( ref( $node ) eq 'TeaPart::Method' ) {
                my $class = $node->{class}{arg_symbol};
                die "undeclared class $class"
                    unless exists $Classes{$class};
                my $method = $node->{method}{arg_symbol};
                push @{ $Classes{$class}{statement} }, $node;
                splice @{ $root->{statement} }, $i, 1;
            }
            else { 
                $i++
            }        
        }
    }
}


sub printMainProg {
    my $package = shift;
    return Language::Tea::JavaEmitter::emit($root, $package);
}


sub printClass {
    my $class = shift;
    return Language::Tea::JavaEmitter::emit($Classes{$class}, $class);
}
 

1; # End of Language::Tea