#ifndef NT_SPAN_H #define NT_SPAN_H #include <iostream> #include "wordid.h" #include "tdict.h" struct Span { int l,r; Span() : l(-1) { } bool is_null() const { return l<0; } void print(std::ostream &o,char const* for_null="") const { if (is_null()) o<<for_null; else o<<'<'<<l<<','<<r<<'>'; } friend inline std::ostream &operator<<(std::ostream &o,Span const& s) { s.print(o);return o; } }; struct NTSpan { Span s; WordID nt; // awkward: this is a positive index, used in TD. but represented as negative in mixed terminal/NT space in rules/hgs. NTSpan() : nt(0) { } // prints as possibly empty name (whatever you set of nt,s will show) void print(std::ostream &o,char const* for_span_null="_",char const* for_null="") const { if (nt>0) { o<<TD::Convert(nt); s.print(o,for_span_null); } else s.print(o,for_null); } friend inline std::ostream &operator<<(std::ostream &o,NTSpan const& t) { t.print(o);return o; } }; #endif