summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Paassen <bpaassen@techfak.uni-bielefeld.de>2015-04-09 14:56:28 +0200
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2016-04-25 22:19:34 +0200
commitbc25012753704943808bb8f71d75f27f68c13da9 (patch)
tree6ef71902aa68e3b6058a0ba47c17ddfbd767dcdb
parent8e27a8e87344e187d67407a37c8818f91ed016fa (diff)
fixed a bug in the DocumentHandler which lead to problems in case of empty explicit fields.
-rw-r--r--src/core/parser/ParserScope.cpp14
-rw-r--r--src/core/parser/stack/DocumentHandler.cpp9
-rw-r--r--src/core/parser/stack/Stack.cpp3
-rw-r--r--test/formats/osxml/OsxmlParserTest.cpp3
-rw-r--r--testdata/integration/basic_functionality/lots_of_empty_elements.in.osml9
-rw-r--r--testdata/integration/basic_functionality/lots_of_empty_elements.out.osxml22
6 files changed, 50 insertions, 10 deletions
diff --git a/src/core/parser/ParserScope.cpp b/src/core/parser/ParserScope.cpp
index e5bf6f6..4b0f376 100644
--- a/src/core/parser/ParserScope.cpp
+++ b/src/core/parser/ParserScope.cpp
@@ -25,6 +25,11 @@
#include "ParserScope.hpp"
+#define SCOPE_DEBUG_OUTPUT 0
+#if SCOPE_DEBUG_OUTPUT
+#include <iostream>
+#endif
+
namespace ousia {
/* Class ParserScopeBase */
@@ -214,6 +219,10 @@ void ParserScope::push(Handle<Node> node)
topLevelNodes.push_back(node);
}
nodes.push_back(node);
+
+#if SCOPE_DEBUG_OUTPUT
+ std::cout << "SCOPE: pushed " << node->type()->name << std::endl;
+#endif
}
void ParserScope::pop(Logger &logger)
@@ -233,7 +242,6 @@ void ParserScope::pop(Logger &logger)
}
}
flags.resize(newLen);
-
// Whenever a RootNode is popped from the stack, we have to perform deferred
// resolution and validate the subtree
Rooted<Node> node = nodes.back();
@@ -247,6 +255,10 @@ void ParserScope::pop(Logger &logger)
// Remove the element from the stack
nodes.pop_back();
+
+#if SCOPE_DEBUG_OUTPUT
+ std::cout << "SCOPE: popped " << node->type()->name << std::endl;
+#endif
}
NodeVector<Node> ParserScope::getTopLevelNodes() const { return topLevelNodes; }
diff --git a/src/core/parser/stack/DocumentHandler.cpp b/src/core/parser/stack/DocumentHandler.cpp
index ce6267f..04f79fb 100644
--- a/src/core/parser/stack/DocumentHandler.cpp
+++ b/src/core/parser/stack/DocumentHandler.cpp
@@ -634,11 +634,12 @@ void DocumentChildHandler::end()
case HandlerType::COMMAND:
case HandlerType::ANNOTATION_START:
case HandlerType::TOKEN:
- // In case of explicit fields we do not want to pop something from
- // the stack.
- if (!isExplicitField) {
+ if(!isExplicitField){
// pop the "main" element.
scope().pop(logger());
+ } else{
+ // in case of explicit fields, roll back.
+ rollbackPath();
}
break;
case HandlerType::ANNOTATION_END:
@@ -692,8 +693,8 @@ void DocumentChildHandler::fieldEnd()
{
if (!isExplicitField) {
popTokens();
+ rollbackPath();
}
- rollbackPath();
}
bool DocumentChildHandler::convertData(Handle<FieldDescriptor> field,
diff --git a/src/core/parser/stack/Stack.cpp b/src/core/parser/stack/Stack.cpp
index 88ddeee..41ced2a 100644
--- a/src/core/parser/stack/Stack.cpp
+++ b/src/core/parser/stack/Stack.cpp
@@ -35,9 +35,6 @@
#include <iostream>
#endif
-// TODO: Remove
-#include <iostream>
-
namespace ousia {
namespace parser_stack {
namespace {
diff --git a/test/formats/osxml/OsxmlParserTest.cpp b/test/formats/osxml/OsxmlParserTest.cpp
index 7c7f2a8..a4ff3c2 100644
--- a/test/formats/osxml/OsxmlParserTest.cpp
+++ b/test/formats/osxml/OsxmlParserTest.cpp
@@ -396,9 +396,8 @@ TEST(OsxmlParser, emptyNamedField){
Rooted<Document> doc = book_document_node.cast<Document>();
ASSERT_TRUE(doc->validate(logger));
checkStructuredEntity(doc->getRoot(), doc, doc, "a");
- ASSERT_EQ(2U, doc->getRoot()->getDescriptor()->getFieldDescriptors().size());
+ ASSERT_EQ(1U, doc->getRoot()->getDescriptor()->getFieldDescriptors().size());
ASSERT_TRUE(doc->getRoot()->getField(0).empty());
- ASSERT_TRUE(doc->getRoot()->getField(1).empty());
}
}
diff --git a/testdata/integration/basic_functionality/lots_of_empty_elements.in.osml b/testdata/integration/basic_functionality/lots_of_empty_elements.in.osml
new file mode 100644
index 0000000..aabdfae
--- /dev/null
+++ b/testdata/integration/basic_functionality/lots_of_empty_elements.in.osml
@@ -0,0 +1,9 @@
+\document
+ \ontology#test
+ \struct#a[root=true]
+ \field#afield[subtree=true]
+ \childRef[ref=a]
+
+\begin{a}
+\afield{\a{}\a{}}
+\end{a}
diff --git a/testdata/integration/basic_functionality/lots_of_empty_elements.out.osxml b/testdata/integration/basic_functionality/lots_of_empty_elements.out.osxml
new file mode 100644
index 0000000..5a7522e
--- /dev/null
+++ b/testdata/integration/basic_functionality/lots_of_empty_elements.out.osxml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<document>
+ <ontology name="test">
+ <struct cardinality="{*}" name="a" root="true" transparent="false">
+ <syntax/>
+ <field name="afield" optional="false" subtree="true">
+ <syntax/>
+ <childRef ref="a"/>
+ </field>
+ </struct>
+ </ontology>
+ <test:a>
+ <afield>
+ <test:a>
+ <afield/>
+ </test:a>
+ <test:a>
+ <afield/>
+ </test:a>
+ </afield>
+ </test:a>
+</document>