[Aurelia-svn] SF.net SVN: aurelia:[108] trunk
Status: Alpha
Brought to you by:
valentindavid
|
From: <val...@us...> - 2010-07-28 15:54:07
|
Revision: 108
http://aurelia.svn.sourceforge.net/aurelia/?rev=108&view=rev
Author: valentindavid
Date: 2010-07-28 15:54:01 +0000 (Wed, 28 Jul 2010)
Log Message:
-----------
2010-07-28 Valentin David <val...@ii...>
* src/parser_generator/syntax.csf: Build tree.
* src/parser_generator/parser_gen.cc: Insert label code.
* src/parser_generator/syntax.cc:
Add necessary environment for the labels' execution.
* src/llstack/queue.hh:
Fix memory bug.
* src/llstack/node.hh:
Remove an unused variable.
* src/llstack/frame.hh:
Add rvalue reference constructor and assignment.
* src/streams/buf_stream.hh:
Hash. Add printing function. Add string building from range.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/llstack/frame.hh
trunk/src/llstack/node.hh
trunk/src/llstack/queue.hh
trunk/src/parser_generator/parser_gen.cc
trunk/src/parser_generator/syntax.cc
trunk/src/parser_generator/syntax.csf
trunk/src/streams/buf_stream.hh
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/ChangeLog 2010-07-28 15:54:01 UTC (rev 108)
@@ -1,3 +1,23 @@
+2010-07-28 Valentin David <val...@ii...>
+
+ * src/parser_generator/syntax.csf: Build tree.
+ * src/parser_generator/parser_gen.cc: Insert label code.
+
+ * src/parser_generator/syntax.cc:
+ Add necessary environment for the labels' execution.
+
+ * src/llstack/queue.hh:
+ Fix memory bug.
+
+ * src/llstack/node.hh:
+ Remove an unused variable.
+
+ * src/llstack/frame.hh:
+ Add rvalue reference constructor and assignment.
+
+ * src/streams/buf_stream.hh:
+ Hash. Add printing function. Add string building from range.
+
2010-07-26 Valentin David <val...@ii...>
* src/parser_generator/syntax.csf:
Modified: trunk/src/llstack/frame.hh
===================================================================
--- trunk/src/llstack/frame.hh 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/llstack/frame.hh 2010-07-28 15:54:01 UTC (rev 108)
@@ -67,18 +67,21 @@
frame(const real_frame& rf): rf(rf.clone()), _hash(rf.hash()) {}
frame(const frame& other): rf(other.rf->clone()), _hash(other._hash) {}
+ frame(frame&& other): rf(other.rf), _hash(other._hash) {
+ other.rf = NULL;
+ }
+
~frame() {
delete rf;
}
- void swap(frame* other) {
- real_frame* t = other->rf;
- other->rf = this->rf;
- this->rf = t;
+ frame& operator=(const frame& other) {
+ return *this = std::move(other);
}
- frame& operator=(frame other) {
- other.swap(this);
+ frame& operator=(frame&& other) {
+ std::swap(rf, other.rf);
+ std::swap(_hash, other._hash);
return *this;
}
Modified: trunk/src/llstack/node.hh
===================================================================
--- trunk/src/llstack/node.hh 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/llstack/node.hh 2010-07-28 15:54:01 UTC (rev 108)
@@ -218,7 +218,7 @@
# ifndef NDEBUG
static void printnodes(std::ostream& o) {
- int status;
+ //int status;
super::o_map_it i = super::objects().begin();
o << "digraph g {" << std::endl;
while (i != super::objects().end()) {
Modified: trunk/src/llstack/queue.hh
===================================================================
--- trunk/src/llstack/queue.hh 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/llstack/queue.hh 2010-07-28 15:54:01 UTC (rev 108)
@@ -96,8 +96,9 @@
descriptor pop() {
map_t::iterator i = m.begin();
while ((*i).second.pending.empty()) {
+ stream s = (*i).first;
m.erase(i);
- node::drop((*i).first);
+ node::drop(s);
collect_nodes();
i = m.begin();
if (i == m.end())
Modified: trunk/src/parser_generator/parser_gen.cc
===================================================================
--- trunk/src/parser_generator/parser_gen.cc 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/parser_generator/parser_gen.cc 2010-07-28 15:54:01 UTC (rev 108)
@@ -241,27 +241,51 @@
V sym, attr;
AttrChainElt[attr, Symbol[sym, NoArg]] = t;
std::string toparse = to_cxx_id(*sym);
+
std::cout << "template <>" << std::endl;
std::cout << "struct branch<" << nt_name
<< "," << index << "," << index_l << "> {" << std::endl;
- std::cout << " typedef ";
- if (index_l > 0)
- std::cout << "drop_ret<";
- std::cout << "parse_symbol<" << toparse
- << ", " << nt_name << "_" << index
- << "_" << index_l << ", branch<" << nt_name
- << "," << index << "," << index_l+1 << "> > ";
- if (index_l > 0)
- std::cout << "> ";
- std::cout << "res;"
- << std::endl;
+ try {
+ V attrcode;
+ V params;
+ static C Some("Some", 1);
+ static C AttrRule("AttrRule", 2);
+
+ Some[AttrRule[params, attrcode]] = *attr;
+ std::cout << " struct res {" << std::endl;
+ std::cout << " void operator()(R_t& R, const frame& f, stream& s, const node& cu) const {" << std::endl;
+ std::cout << ((get_cons_name < undouble_quote)(*attrcode)) << std::endl;
+ std::cout << " parse_symbol<" << toparse
+ << ", " << nt_name << "_" << index
+ << "_" << index_l << ", branch<" << nt_name
+ << "," << index << "," << index_l+1 << "> > next;"
+ << std::endl;
+ std::cout << " next(R, next_frame, s, cu);" << std::endl;
+ std::cout << " }" << std::endl;
+ std::cout << " unsigned hash() const {" << std::endl;
+ std::cout << " return (unsigned)&typeid(res);" << std::endl;
+ std::cout << " }" << std::endl;
+ std::cout << " };" << std::endl;
+ } catch (Failure) {
+ std::cout << " typedef ";
+ if (index_l > 0)
+ std::cout << "drop_ret<";
+ std::cout << "parse_symbol<" << toparse
+ << ", " << nt_name << "_" << index
+ << "_" << index_l << ", branch<" << nt_name
+ << "," << index << "," << index_l+1 << "> > ";
+ if (index_l > 0)
+ std::cout << "> ";
+ std::cout << "res;"
+ << std::endl;
+ }
std::cout << "};" <<std::endl;
-
} catch (Failure) {
try {
V s, attr;
AttrChainElt[attr, String[s]] = t;
int i = fresh();
+
std::cout << "struct str_"<<i<<" {" <<std::endl;
std::cout << " static const char* str;" << std::endl;
std::cout << "};" << std::endl;
@@ -275,17 +299,39 @@
<< "," << index
<< "," << index_l << "> {" << std::endl;
- std::cout << " typedef ";
- if (index_l > 0)
- std::cout << "drop_ret<";
- std::cout << "parse_string<str_"
- << i << ", branch<" << nt_name
- << "," << index << "," << index_l + 1
- << "> > ";
- if (index_l > 0)
- std::cout << "> ";
- std::cout << "res;" << std::endl;
+ try {
+ V attrcode;
+ V params;
+ static C Some("Some", 1);
+ static C AttrRule("AttrRule", 2);
+ Some[AttrRule[params, attrcode]] = *attr;
+ std::cout << " struct res {" << std::endl;
+ std::cout << " void operator()(R_t& R, const frame& f, stream& s, const node& cu) const {" << std::endl;
+ std::cout << ((get_cons_name < undouble_quote)(*attrcode)) << std::endl;
+ std::cout << " parse_string<str_"
+ << i << ", branch<" << nt_name
+ << "," << index << "," << index_l + 1
+ << "> > next;" << std::endl;
+ std::cout << " next(R, next_frame, s, cu);" << std::endl;
+ std::cout << " }" << std::endl;
+ std::cout << " unsigned hash() const {" << std::endl;
+ std::cout << " return (unsigned)&typeid(res);" << std::endl;
+ std::cout << " }" << std::endl;
+ std::cout << " };" << std::endl;
+ } catch (Failure) {
+ std::cout << " typedef ";
+ if (index_l > 0)
+ std::cout << "drop_ret<";
+ std::cout << "parse_string<str_"
+ << i << ", branch<" << nt_name
+ << "," << index << "," << index_l + 1
+ << "> > ";
+ if (index_l > 0)
+ std::cout << "> ";
+ std::cout << "res;" << std::endl;
+ }
+
std::cout << "};" << std::endl;
} catch (Failure) {
V s, attr;
@@ -344,9 +390,7 @@
std::cout << " struct res {" << std::endl;
std::cout << " void operator()(R_t& R, const frame& f, stream& s, const node& cu) const {" << std::endl;
std::cout << ((get_cons_name < undouble_quote)(*attrcode)) << std::endl;
- std::cout << " pop<branch<" << nt_name << ","
- << index << "," << s << "> > next;" << std::endl;
- std::cout << " next(R, f, s, cu);" << std::endl;
+ std::cout << " cu.pop(R, ret, s);" << std::endl;
std::cout << " }" << std::endl;
std::cout << " unsigned hash() const {" << std::endl;
std::cout << " return (unsigned)&typeid(res);" << std::endl;
@@ -418,10 +462,10 @@
T operator()(const T& in) {
static C Rule("Rule", 4);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
- V l, nt;
+ //static V Void = T(C("Void"));
+ V l, nt, return_type;
- Rule[nt, NoParam, Void, l] = in;
+ Rule[nt, NoParam, return_type, l] = in;
if (set[*nt])
throw Failure();
try {
@@ -533,12 +577,12 @@
T operator()(const T& in) {
static C Rule("Rule", 4);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
+ //static V Void = T(C("Void"));
static C Chain("Chain", 2);
- V l, nt, attr, chain;
+ V l, nt, attr, chain, return_type;
- Rule[nt, NoParam, Void, l] = in;
+ Rule[nt, NoParam, return_type, l] = in;
char_set_t c;
map(try_(scope(attr,
scope(chain,
@@ -658,11 +702,11 @@
T operator()(const T& in) {
static C Rule("Rule", 4);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
+ //static V Void = T(C("Void"));
- V l, nt;
+ V l, nt, return_type;
- Rule[nt, NoParam, Void, l] = in;
+ Rule[nt, NoParam, return_type, l] = in;
char_set_t c;
std::cerr << "rule: " << in << std::endl;
@@ -797,11 +841,11 @@
static C Chain("Chain", 2);
static C Rule("Rule", 4);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
+ //static V Void = T(C("Void"));
- V l, nt;
+ V l, nt, return_type;
- Rule[nt, NoParam, Void, l] = in;
+ Rule[nt, NoParam, return_type, l] = in;
std::string nt_name = to_cxx_id(*nt);
map_index(gen_branch(nt_name))(*l);
std::cout << "struct " << nt_name << " {" << std::endl;
@@ -1003,10 +1047,10 @@
static C Rule("Rule", 4);
static C Chain("Chain", 2);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
- V l, nt, chain, attr;
+ //static V Void = T(C("Void"));
+ V l, nt, chain, attr, return_type;
- Rule[nt, NoParam, Void, l] = t;
+ Rule[nt, NoParam, return_type, l] = t;
std::cout << "/*" << *nt << "*/" << std::endl;
int i = 0;
@@ -1095,11 +1139,11 @@
static C Rule("Rule", 4);
static C Chain("Chain", 2);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
+ //static V Void = T(C("Void"));
- V l, nt, chain, attr;
+ V l, nt, chain, attr, return_type;
- Rule[nt, NoParam, Void, l] = t;
+ Rule[nt, NoParam, return_type, l] = t;
map(scope(chain, scope(attr, ~Chain[chain, attr] < !chain <
get_bin_empty_r(build_empty, &data))))(*l);
@@ -1123,10 +1167,10 @@
static C Rule("Rule", 4);
static C Chain("Chain", 2);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
- V l, nt;
+ //static V Void = T(C("Void"));
+ V l, nt, return_type;
- Rule[nt, NoParam, Void, l] = t;
+ Rule[nt, NoParam, return_type, l] = t;
int rule = 0;
for (T rt = *l; rt.constructor() == C::AS_LIST; rt = rt[1], ++rule) {
@@ -1163,13 +1207,13 @@
static C Rule("Rule", 4);
static V NoParam = T(C("NoParam"));
- static V Void = T(C("Void"));
+ //static V Void = T(C("Void"));
- V l, nt;
+ V l, nt, return_type;
std::cout << "enum nonterm {" << std::endl;
map(scope(nt, scope(l,
- ~Rule[nt, NoParam, Void, l]
+ ~Rule[nt, NoParam, return_type, l]
< !nt
< [](const T& t) {
std::cout << " NT_" << to_cxx_id(t)
@@ -1215,7 +1259,7 @@
std::cout << "const unsigned char follow[NUM_NT][32] = {" << std::endl;
map(scope(nt,
scope(l,
- ~Rule[nt, NoParam, Void, l]
+ ~Rule[nt, NoParam, return_type, l]
< !nt
< [&build_follow](const T& t) {
std::cout << " /*" << t << "*/ {";
@@ -1229,7 +1273,7 @@
map(scope(nt,
scope(l,
- ~Rule[nt, NoParam, Void, l]
+ ~Rule[nt, NoParam, return_type, l]
< !l
< [&nt](const T& t) {
std::cout << "struct " << to_cxx_id(*nt)
Modified: trunk/src/parser_generator/syntax.cc
===================================================================
--- trunk/src/parser_generator/syntax.cc 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/parser_generator/syntax.cc 2010-07-28 15:54:01 UTC (rev 108)
@@ -23,9 +23,18 @@
#include "streams/buf_stream.hh"
#include "llstack/label.hh"
#include "llstack/node.hpp"
+#include "terms/term.hh"
using namespace aurelia;
using namespace llstack;
+struct Main {};
+typedef Term<Main> T;
+typedef Constructor<Main> C;
+
+frame pop_void(const frame& f) {
+ return f.as<ret_frame<VoidReturn> >().parent;
+}
+
#include "syntax.hh"
bool found;
Modified: trunk/src/parser_generator/syntax.csf
===================================================================
--- trunk/src/parser_generator/syntax.csf 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/parser_generator/syntax.csf 2010-07-28 15:54:01 UTC (rev 108)
@@ -17,6 +17,7 @@
}
}
}
+ VoidReturn ret;
$ |
$ if (!s.eof()) {
switch (*s) {
@@ -33,9 +34,10 @@
if (*next == '/')
return ;
}
- }
+ }
}
}
+ VoidReturn ret;
$
LAYOUT+ ::= LAYOUT LAYOUT?
@@ -49,13 +51,22 @@
Range ::= Char "-" Char
RangesOrChars ::= Range RangesOrChars? | Char RangesOrChars?
RangesOrChars? ::= RangesOrChars |
- ClassChar ::= "[" RangesOrChars "]"
- | "[" "^" RangesOrChars "]"
+ ClassChar ::= $ ret_frame<stream> next_frame(f, s); $ "[" $ frame next_frame(f); $ RangesOrChars $ frame next_frame(pop_void(f)); $ "]"
+ $
+ ret_frame<stream> rf0 = f.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf0.t, s) + "\"", 0));
+ $
+ | $ ret_frame<stream> next_frame(f, s); $ "[" $ frame next_frame(f); $ "^" $ frame next_frame(f); $ RangesOrChars $ frame next_frame(pop_void(f)); $ "]"
+ $
+ ret_frame<stream> rf0 = f.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf0.t, s) + "\"", 0));
+ $
+
SymbolChar ::= [A-Z] | [a-z] | "*" | "?" | "+" | "-" | "_"
SymbolChar+ ::= SymbolChar SymbolChar*
SymbolChar* ::= SymbolChar+ |
- Symbol ::= SymbolChar+ $
+ Symbol ::= $ ret_frame<stream> next_frame(f, s); $ SymbolChar+ $
if (!s.eof()) {
switch (*s) {
case '*':
@@ -70,48 +81,153 @@
if (((*s) >= 'a') && (*s) <= 'z')
return ;
}
+ ret_frame<VoidReturn> rf0 = f.as<ret_frame<VoidReturn> >();
+ ret_frame<stream> rf1 = rf0.parent.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf1.t, s) + "\"", 0));
$
StringChar ::= [^\"\\] | "\\" SpecialChar
StringChar+ ::= StringChar StringChar*
StringChar* ::= StringChar+ |
- String ::= "\"" StringChar* "\""
+ String ::= $ ret_frame<stream> next_frame(f, s); $ "\""
+ $ frame next_frame(f); $ StringChar* $ frame next_frame(pop_void(f)); $ "\""
+ $
+ ret_frame<stream> rf0 = f.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf0.t, s) + "\"", 0));
+ $
Rule ::=
- Symbol LAYOUT? ParameterList LAYOUT? RetType LAYOUT? "::=" LAYOUT? ListOfChains
+ Symbol $ frame next_frame(f); $ //rf7
+ LAYOUT? $ frame next_frame(f); $ //rf6
+ ParameterList $ frame next_frame(f); $ //rf5
+ LAYOUT? $ frame next_frame(f); $ //rf4
+ RetType $ frame next_frame(f); $ //rf3
+ LAYOUT? $ frame next_frame(f); $ //rf2
+ "::=" $ frame next_frame(f); $
+ LAYOUT? $ frame next_frame(f); $ //rf1
+ ListOfChains //rf0
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<VoidReturn> rf2 = rf1.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf3 = rf2.parent.as<ret_frame<T> >();
+ ret_frame<VoidReturn> rf4 = rf3.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf5 = rf4.parent.as<ret_frame<T> >();
+ ret_frame<VoidReturn> rf6 = rf5.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf7 = rf6.parent.as<ret_frame<T> >();
+ T ret(C("Rule", 4), (rf7.t, rf5.t, rf3.t, rf0.t));
+ $
- S ::= LAYOUT? SS LAYOUT?
- SS ::= Rule LAYOUT? SSS
- SSS ::= SS |
+ S ::= LAYOUT? SS LAYOUT? $
+ ret_frame<VoidReturn> rf0 = f.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf1 = rf0.parent.as<ret_frame<T> >();
+ std::cerr << rf1.t << std::endl;
+ VoidReturn ret;
+ $
+ SS ::= Rule $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ SSS
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf2 = rf1.parent.as<ret_frame<T> >();
+ T ret(C::AS_LIST, (rf2.t, rf0.t));
+ $
+ SSS ::= SS $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret(rf0.t);
+ $
+ | $ T ret(C::AS_EMPTY_LIST); $
- ParameterList ::= "(" LAYOUT? Parameters LAYOUT? ")" |
- LocalParameters ::= "{" LAYOUT? Parameters LAYOUT? "}" |
+ ParameterList ::=
+ "(" LAYOUT? Parameters $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ ")"
+ $ T ret = f.as<ret_frame<VoidReturn> >().parent.as<ret_frame<T> >().t; $
+ | $ T ret(C("NoParam")); $
- ListOfChains ::= Chain LAYOUT? AttrRule? LAYOUT? ListOfChainsTail
- ListOfChainsTail ::= "|" LAYOUT? ListOfChains |
+ LocalParameters ::= "{" LAYOUT? Parameters $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ "}"
+ $ T ret(C("Some", 1), f.as<ret_frame<VoidReturn> >().parent.as<ret_frame<T> >().t); $
+ | $ T ret(C("None")); $
- RetType ::= ":" LAYOUT? CxxType |
+ ListOfChains ::= Chain $ frame next_frame(f); $ LAYOUT? $ frame next_frame(pop_void(f)); $ AttrRule? $ frame next_frame(f); $ LAYOUT? $ frame next_frame(pop_void(f)); $ ListOfChainsTail
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<T> rf1 = rf0.parent.as<ret_frame<T> >();
+ ret_frame<T> rf2 = rf1.parent.as<ret_frame<T> >();
+ T ret(C::AS_LIST, (T(C("Chain", 2), (rf2.t, rf1.t)), rf0.t));
+ $
+ ListOfChainsTail ::= "|" LAYOUT? ListOfChains $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret(rf0.t);
+ $
+ | $ T ret(C::AS_EMPTY_LIST); $
+
+ RetType ::= ":" LAYOUT? CxxType
+ $ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret = rf0.t;
+ $
+ | $ T ret(C("Void")); $
+
Chain ::=
- NonEmptyChain |
+ NonEmptyChain $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret(rf0.t);
+ $
+ | $ T ret(C::AS_EMPTY_LIST); $
NonEmptyChain ::=
- AttrRule? LAYOUT? ChainElt LAYOUT? Chain
+ AttrRule? $ frame next_frame(f); $ LAYOUT? $ frame next_frame(pop_void(f)); $ ChainElt $ frame next_frame(f); $ LAYOUT? $ frame next_frame(pop_void(f)); $ Chain
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<T> rf1 = rf0.parent.as<ret_frame<T> >();
+ ret_frame<T> rf2 = rf1.parent.as<ret_frame<T> >();
+ T ret(C::AS_LIST, (T(C("AttrChainElt", 2), (rf2.t, rf1.t)), rf0.t));
+ $
AttrRule ::=
- LocalParameters LAYOUT? "$" CxxCode "$"
+ LocalParameters $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ "$" $ ret_frame<stream> next_frame(f, s); $ CxxCode $ ret_frame<stream> next_frame(f, s); $ "$"
+ $
+ ret_frame<stream> rf0 = f.as<ret_frame<stream> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<stream> rf2 = rf1.parent.as<ret_frame<stream> >();
+ ret_frame<VoidReturn> rf3 = rf2.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf4 = rf3.parent.as<ret_frame<T> >();
+ T ret(C("AttrRule", 2), (rf4.t,
+ T(C("\"" + stream_range_to_string(rf2.t, rf0.t) + "\"", 0))));
+ $
ChainElt ::=
- String | ClassChar
+ String
+ $ T ret(C("String", 1), f.as<ret_frame<T> >().t); $
+ | ClassChar
+ $ T ret(C("Class", 1), f.as<ret_frame<T> >().t); $
| Symbol LAYOUT? ArgumentList
+ $ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<T> rf1 = rf0.parent.as<ret_frame<T> >();
+ T ret(C("Symbol", 2), (rf1.t, rf0.t)); $
- ArgumentList ::= "(" LAYOUT? Arguments LAYOUT? ")" |
+ ArgumentList ::= "(" LAYOUT? Arguments $ frame next_frame(f); $ LAYOUT? $ frame next_frame(pop_void(f)); $ ")" $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret(C("Args", 1), rf0.t);
+ $
+ | $ T ret(C("NoArg")); $
- OtherArguments ::= "," LAYOUT? Arguments |
+ OtherArguments ::= "," LAYOUT? Arguments $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret(rf0.t);
+ $
+ | $ T ret(C::AS_EMPTY_LIST); $
- Arguments ::= Argument LAYOUT? OtherArguments
+ Arguments ::= Argument $ frame next_frame(f); $ LAYOUT? $ frame next_frame(pop_void(f)); $ OtherArguments
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<T> rf1 = rf0.parent.as<ret_frame<T> >();
+ T ret(C::AS_LIST, (rf1.t, rf0.t));
+ $
- Argument ::= CxxExpression
+ Argument ::= $ ret_frame<stream> next_frame(f, s); $ CxxExpression $
+ ret_frame<VoidReturn> rf0 = f.as<ret_frame<VoidReturn> >();
+ ret_frame<stream> rf1 = rf0.parent.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf1.t, s) + "\"", 0));
+ $
CxxExpression ::= CxxIdentifier
| CxxExpression LAYOUT? "." LAYOUT? CxxIdentifier
@@ -120,19 +236,54 @@
CxxCode? ::= CxxCode |
CxxChar ::= [^$]
- Parameter ::= CxxType LAYOUT CxxIdentifier
+ Parameter ::= CxxType $ frame next_frame(f); $ LAYOUT $ frame next_frame(f); $ CxxIdentifier
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf2 = rf1.parent.as<ret_frame<T> >();
+ T ret(C("Parameter", 2), (rf2.t, rf0.t));
+ $
- CxxType ::= CxxIdentifier LAYOUT? TemplateArguments LAYOUT? ContCxxType
+ CxxType ::= $ ret_frame<stream> next_frame(f, s); $ CxxIdentifier $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ TemplateArguments $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ ContCxxType
+ $
+ ret_frame<VoidReturn> rf0 = f.as<ret_frame<VoidReturn> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<VoidReturn> rf2 = rf1.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<VoidReturn> rf3 = rf2.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<VoidReturn> rf4 = rf3.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<stream> rf5 = rf4.parent.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf5.t, s) + "\"", 0));
+ $
ContCxxType ::= "::" LAYOUT? CxxType |
TemplateArguments ::= "<" LAYOUT? CxxTypes LAYOUT? ">" |
CxxTypes ::= CxxType LAYOUT CCT
CCT ::= "," LAYOUT? CxxType |
- AttrRule? ::= AttrRule |
+ AttrRule? ::= AttrRule
+ $ T ret(T(C("Some", 1), f.as<ret_frame<T> >().t)); $
+ |
+ $ T ret(T(C("None"))); $
- Parameters ::= Parameter LAYOUT? CParameters
- CParameters ::= "," LAYOUT? Parameters |
+ Parameters ::= Parameter $ frame next_frame(f); $ LAYOUT? $ frame next_frame(f); $ CParameters
+ $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<T> rf2 = rf1.parent.as<ret_frame<T> >();
+ T ret(C::AS_LIST, (rf2.t, rf0.t));
+ $
- CxxIdentifier ::= [A-Za-z_] CIS
+ CParameters ::= "," LAYOUT? Parameters $
+ ret_frame<T> rf0 = f.as<ret_frame<T> >();
+ T ret(rf0.t);
+ $
+ | $ T ret(C::AS_EMPTY_LIST); $
+
+ CxxIdentifier ::= $ ret_frame<stream> next_frame(f, s); $ [A-Za-z_] $ frame next_frame(f); $ CIS
+ $
+ ret_frame<VoidReturn> rf0 = f.as<ret_frame<VoidReturn> >();
+ ret_frame<VoidReturn> rf1 = rf0.parent.as<ret_frame<VoidReturn> >();
+ ret_frame<stream> rf2 = rf1.parent.as<ret_frame<stream> >();
+ T ret(C("\"" + stream_range_to_string(rf2.t, s) + "\"", 0));
+ $
CIS ::= [A-Za-z_0-9] CIS |
Modified: trunk/src/streams/buf_stream.hh
===================================================================
--- trunk/src/streams/buf_stream.hh 2010-07-26 17:17:32 UTC (rev 107)
+++ trunk/src/streams/buf_stream.hh 2010-07-28 15:54:01 UTC (rev 108)
@@ -20,6 +20,7 @@
# include <forward_list>
# include <istream>
+# include <sstream>
namespace aurelia {
@@ -39,12 +40,18 @@
int pos;
public:
+ unsigned hash() const;
+
int get_pos() const {
return pos;
}
bool operator==(const buf_stream_iterator& other) const;
+ bool operator!=(const buf_stream_iterator& other) const {
+ return !(*this == other);
+ }
+
bool operator<(const buf_stream_iterator& other) const {
return pos < other.pos;
}
@@ -93,6 +100,7 @@
std::istream* real_stream;
std::forward_list<rc_char> buf;
int start;
+ unsigned _hash;
#ifndef NDEBUG
int size;
#endif
@@ -121,8 +129,14 @@
#ifndef NDEBUG
, size(0)
#endif
- {}
+ {
+ _hash = (unsigned)&s;
+ }
+ unsigned hash() const {
+ return _hash;
+ }
+
buf_stream& operator=(buf_stream other) {
this->swap(other);
return *this;
@@ -235,6 +249,13 @@
std::swap(i, other.i);
}
+unsigned buf_stream_iterator::hash() const {
+ //!FIXME: -1 should have the same hash as EOF
+ unsigned hash = (unsigned)pos;
+ hash = (hash << 11) | (hash >> 21);
+ hash ^= s->hash();
+}
+
bool buf_stream_iterator::operator==(const buf_stream_iterator& other) const {
if (pos == -1) {
return s->is_end(other.i);
@@ -247,6 +268,20 @@
typedef buf_stream_iterator stream;
+ std::string stream_range_to_string(stream begin, const stream& end) {
+ std::stringstream ret;
+ while (begin != end) {
+ ret << *begin;
+ ++begin;
+ }
+ return ret.str();
+ }
+
+ template <typename Stream>
+ Stream& operator<<(Stream& s, const stream& i) {
+ s << "(stream:" << i.get_pos() << ")";
+ return s;
+ }
}
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|