00001 #pragma once
00002
00003 #include <iostream>
00004 #include <string>
00005 #include <map>
00006 #include <vector>
00007 #include <boost/shared_ptr.hpp>
00008 #include <boost/make_shared.hpp>
00009 #include "util/generator.hh"
00010 #include "util/exception.hh"
00011
00012 namespace MosesTuning
00013 {
00014
00015 class InternalTree;
00016 typedef boost::shared_ptr<InternalTree> TreePointer;
00017 typedef int NTLabel;
00018
00019 class InternalTree
00020 {
00021 std::string m_value;
00022 std::vector<TreePointer> m_children;
00023 bool m_isTerminal;
00024 public:
00025 InternalTree(const std::string & line, const bool terminal = false);
00026 InternalTree(const InternalTree & tree):
00027 m_value(tree.m_value),
00028 m_isTerminal(tree.m_isTerminal) {
00029 const std::vector<TreePointer> & children = tree.m_children;
00030 for (std::vector<TreePointer>::const_iterator it = children.begin(); it != children.end(); it++) {
00031 m_children.push_back(boost::make_shared<InternalTree>(**it));
00032 }
00033 }
00034 size_t AddSubTree(const std::string & line, size_t start);
00035
00036 std::string GetString(bool start = true) const;
00037 void Combine(const std::vector<TreePointer> &previous);
00038 const std::string & GetLabel() const {
00039 return m_value;
00040 }
00041
00042 size_t GetLength() const {
00043 return m_children.size();
00044 }
00045 std::vector<TreePointer> & GetChildren() {
00046 return m_children;
00047 }
00048
00049 bool IsTerminal() const {
00050 return m_isTerminal;
00051 }
00052
00053 bool IsLeafNT() const {
00054 return (!m_isTerminal && m_children.size() == 0);
00055 }
00056 };
00057
00058
00059 $generator(leafNT)
00060 {
00061 std::vector<TreePointer>::iterator it;
00062 InternalTree* tree;
00063 leafNT(InternalTree* root = 0): tree(root) {}
00064 $emit(std::vector<TreePointer>::iterator)
00065 for (it = tree->GetChildren().begin(); it !=tree->GetChildren().end(); ++it) {
00066 if (!(*it)->IsTerminal() && (*it)->GetLength() == 0) {
00067 $yield(it);
00068 } else if ((*it)->GetLength() > 0) {
00069 if ((*it).get()) {
00070 $restart(tree = (*it).get());
00071 }
00072 }
00073 }
00074 $stop;
00075 };
00076
00077 }