00001 #pragma once
00002
00003 #include "moses/Syntax/PHyperedge.h"
00004 #include "moses/Syntax/PVertex.h"
00005 #include "moses/Syntax/S2T/Parsers/Parser.h"
00006 #include "moses/Syntax/S2T/RuleTrieCYKPlus.h"
00007 #include "moses/Range.h"
00008
00009 namespace Moses
00010 {
00011 namespace Syntax
00012 {
00013 namespace S2T
00014 {
00015
00016
00017
00018
00019
00020
00021
00022 template<typename Callback>
00023 class RecursiveCYKPlusParser : public Parser<Callback>
00024 {
00025 public:
00026 typedef Parser<Callback> Base;
00027 typedef RuleTrieCYKPlus RuleTrie;
00028
00029
00030 static bool RequiresCompressedChart() {
00031 return true;
00032 }
00033
00034 RecursiveCYKPlusParser(PChart &, const RuleTrie &, std::size_t);
00035
00036 ~RecursiveCYKPlusParser() {}
00037
00038 void EnumerateHyperedges(const Range &, Callback &);
00039
00040 private:
00041
00042 void GetTerminalExtension(const RuleTrie::Node &, std::size_t, std::size_t);
00043
00044 void GetNonTerminalExtensions(const RuleTrie::Node &, std::size_t,
00045 std::size_t, std::size_t);
00046
00047 void AddAndExtend(const RuleTrie::Node &, std::size_t, const PVertex &);
00048
00049 bool IsNonLexicalUnary(const PHyperedge &) const;
00050
00051 const RuleTrie &m_ruleTable;
00052 const std::size_t m_maxChartSpan;
00053 std::size_t m_maxEnd;
00054 PHyperedge m_hyperedge;
00055 Callback *m_callback;
00056 };
00057
00058 }
00059 }
00060 }
00061
00062
00063 #include "RecursiveCYKPlusParser-inl.h"