[DEV] rework cyclic element
This commit is contained in:
parent
db8e588a19
commit
4310cdbe84
100
etk/RegExp.h
100
etk/RegExp.h
@ -159,8 +159,9 @@ class FindProperty {
|
|||||||
int64_t m_positionStart; //!< find start position
|
int64_t m_positionStart; //!< find start position
|
||||||
int64_t m_positionStop; //!< find end position
|
int64_t m_positionStop; //!< find end position
|
||||||
uint32_t m_multiplicity; //!< curent multiplicity of find element
|
uint32_t m_multiplicity; //!< curent multiplicity of find element
|
||||||
std::vector<FindProperty> m_subProperty; //!< list of all sub elements
|
|
||||||
enum parseStatus m_status; //!< curent status of parsing
|
enum parseStatus m_status; //!< curent status of parsing
|
||||||
|
public:
|
||||||
|
std::vector<FindProperty> m_subProperty; //!< list of all sub elements
|
||||||
public:
|
public:
|
||||||
FindProperty() :
|
FindProperty() :
|
||||||
m_positionStart(-1),
|
m_positionStart(-1),
|
||||||
@ -209,20 +210,20 @@ class FindProperty {
|
|||||||
void display(const std::string& _data, int32_t _level = 0) {
|
void display(const std::string& _data, int32_t _level = 0) {
|
||||||
TK_INFO("prop : " << levelSpace(_level) << " ["
|
TK_INFO("prop : " << levelSpace(_level) << " ["
|
||||||
<< m_positionStart << ","
|
<< m_positionStart << ","
|
||||||
<< m_positionStop << "] mul="
|
<< m_positionStop << "]*"
|
||||||
<< m_multiplicity << " data='"
|
<< m_multiplicity << " data='"
|
||||||
<< std::string(_data, m_positionStart, m_positionStop-m_positionStart) << "'");
|
<< std::string(_data, m_positionStart, m_positionStop-m_positionStart) << "'");
|
||||||
for (auto &it : m_subProperty) {
|
for (auto &it : m_subProperty) {
|
||||||
it.display(_data, _level++);
|
it.display(_data, _level+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void display(int32_t _level = 0) {
|
void display(int32_t _level = 0) {
|
||||||
TK_INFO("prop : " << levelSpace(_level) << " ["
|
TK_INFO("prop : " << levelSpace(_level) << " ["
|
||||||
<< m_positionStart << ","
|
<< m_positionStart << ","
|
||||||
<< m_positionStop << "] mul="
|
<< m_positionStop << "]*"
|
||||||
<< m_multiplicity);
|
<< m_multiplicity);
|
||||||
for (auto &it : m_subProperty) {
|
for (auto &it : m_subProperty) {
|
||||||
it.display(_level++);
|
it.display(_level+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -966,8 +967,53 @@ template<class CLASS_TYPE> class NodePTheseElem : public Node<CLASS_TYPE> {
|
|||||||
return _data.size();
|
return _data.size();
|
||||||
};
|
};
|
||||||
private:
|
private:
|
||||||
void parseInternal(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property, size_t _startListIndex) {
|
bool parseInternal(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property, size_t _startListIndex) {
|
||||||
|
std::vector<FindProperty> subProperty;
|
||||||
|
int findLen = 0;
|
||||||
|
bool error = false;
|
||||||
|
bool findPartialNode = false;
|
||||||
|
do {
|
||||||
|
findPartialNode = false;
|
||||||
|
int64_t tmpCurrentPos = _currentPos;
|
||||||
|
for (size_t iii=_startListIndex+subProperty.size(); iii<m_subNode.size(); ++iii) {
|
||||||
|
FindProperty prop;
|
||||||
|
prop.setPositionStart(tmpCurrentPos);
|
||||||
|
int32_t offset = 0;
|
||||||
|
m_subNode[iii]->parse(_data, tmpCurrentPos, _lenMax, prop);
|
||||||
|
offset = prop.getFindLen();
|
||||||
|
tmpCurrentPos = prop.getPositionStop();
|
||||||
|
subProperty.push_back(prop);
|
||||||
|
if (prop.getStatus() == parseStatusNone) {
|
||||||
|
error = true;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 find : " << prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (error == false) {
|
||||||
|
//_property.m_subProperty.push_back(prop);
|
||||||
|
for (auto &it: subProperty) {
|
||||||
|
_property.m_subProperty.push_back(it);
|
||||||
|
}
|
||||||
|
_property.setPositionStop(tmpCurrentPos);
|
||||||
|
_property.setStatus(parseStatusFull);
|
||||||
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem=" << "/" << m_subNode.size() << ") 2 return : " << _property);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Display sub List :
|
||||||
|
for (auto &it : subProperty) {
|
||||||
|
TK_REG_EXP_DBG_MODE(" plop : " << it);
|
||||||
|
}
|
||||||
|
for (int64_t iii=subProperty.size()-1; iii>=0; --iii) {
|
||||||
|
if (subProperty[iii].getStatus() == parseStatusPartial) {
|
||||||
|
findPartialNode = true;
|
||||||
|
subProperty.erase(subProperty.begin()+iii, subProperty.end());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (findPartialNode == true);
|
||||||
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem=" << "/" << m_subNode.size() << ") 2 second parse ... (done)");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
virtual void parse(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property) {
|
virtual void parse(const CLASS_TYPE& _data, int64_t _currentPos, int64_t _lenMax, FindProperty& _property) {
|
||||||
@ -990,41 +1036,30 @@ template<class CLASS_TYPE> class NodePTheseElem : public Node<CLASS_TYPE> {
|
|||||||
tmpCurrentPos = prop.getPositionStop();
|
tmpCurrentPos = prop.getPositionStop();
|
||||||
if ( prop.getStatus() == parseStatusPartial
|
if ( prop.getStatus() == parseStatusPartial
|
||||||
&& iii+1<m_subNode.size() ) {
|
&& iii+1<m_subNode.size() ) {
|
||||||
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel+1) << " (Elem) 2 second parse ...");
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel+1) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 second parse ...");
|
||||||
int64_t tmpCurrentPos2 = tmpCurrentPos;
|
|
||||||
int findLen2 = 0;
|
|
||||||
bool error = false;
|
|
||||||
for (size_t jjj=iii+1; jjj<m_subNode.size(); ++jjj) {
|
|
||||||
FindProperty prop2;
|
FindProperty prop2;
|
||||||
prop2.setPositionStart(tmpCurrentPos2);
|
if (parseInternal(_data, tmpCurrentPos, _lenMax, prop2, iii) == true) {
|
||||||
int32_t offset2 = 0;
|
_property.m_subProperty.push_back(prop);
|
||||||
do {
|
/*
|
||||||
m_subNode[jjj]->parse(_data, tmpCurrentPos2, _lenMax, prop2);
|
for (auto &it: subProperty) {
|
||||||
offset2 = prop2.getFindLen();
|
_property.m_subProperty.push_back(it);
|
||||||
tmpCurrentPos2 = prop2.getPositionStop();
|
|
||||||
} while (prop2.getStatus() == parseStatusPartial);
|
|
||||||
if (prop2.getStatus() == parseStatusNone) {
|
|
||||||
error = true;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem) 2 find : " << prop2);
|
|
||||||
}
|
}
|
||||||
}
|
*/
|
||||||
if (error == false) {
|
_property.setPositionStop(tmpCurrentPos);
|
||||||
_property.setPositionStop(tmpCurrentPos2);
|
|
||||||
_property.setStatus(parseStatusFull);
|
_property.setStatus(parseStatusFull);
|
||||||
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem) 2 return : " << _property);
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 return : " << _property);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem) 2 second parse ... (done)");
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") 2 second parse ... (done)");
|
||||||
}
|
}
|
||||||
} while (prop.getStatus() == parseStatusPartial);
|
} while (prop.getStatus() == parseStatusPartial);
|
||||||
|
_property.m_subProperty.push_back(prop);
|
||||||
if (prop.getStatus() == parseStatusNone) {
|
if (prop.getStatus() == parseStatusNone) {
|
||||||
findLen = 0;
|
findLen = 0;
|
||||||
_property.setStatus(parseStatusNone);
|
_property.setStatus(parseStatusNone);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem) find : " << prop);
|
TK_REG_EXP_DBG_MODE("Parse " << levelSpace(Node<CLASS_TYPE>::m_nodeLevel) << " (Elem=" << iii << "/" << m_subNode.size() << ") find : " << prop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tmpCurrentPos<_currentPos) {
|
if (tmpCurrentPos<_currentPos) {
|
||||||
@ -1142,6 +1177,7 @@ template<class CLASS_TYPE> class NodePThese : public Node<CLASS_TYPE> {
|
|||||||
} while (prop.getStatus() == parseStatusPartial);
|
} while (prop.getStatus() == parseStatusPartial);
|
||||||
if (prop.getStatus() == parseStatusFull) {
|
if (prop.getStatus() == parseStatusFull) {
|
||||||
findLen += prop.getFindLen();
|
findLen += prop.getFindLen();
|
||||||
|
_property.m_subProperty.push_back(prop);
|
||||||
tmpFind = true;
|
tmpFind = true;
|
||||||
} else if (prop.getStatus() == parseStatusPartial) {
|
} else if (prop.getStatus() == parseStatusPartial) {
|
||||||
|
|
||||||
@ -1559,11 +1595,11 @@ template<class CLASS_TYPE> class RegExp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_exprRootNode.setPositionStart(_startPos);
|
|
||||||
regexp::FindProperty prop;
|
regexp::FindProperty prop;
|
||||||
|
prop.setPositionStart(_startPos);
|
||||||
m_exprRootNode.parse(_SearchIn, _startPos, maxlen, prop);
|
m_exprRootNode.parse(_SearchIn, _startPos, maxlen, prop);
|
||||||
if (prop.getStatus() == regexp::parseStatusFull) {
|
if (prop.getStatus() == regexp::parseStatusFull) {
|
||||||
findLen = m_exprRootNode.getFindLen();
|
findLen = prop.getFindLen();
|
||||||
if ( _escapeChar != 0
|
if ( _escapeChar != 0
|
||||||
&& _startPos>0) {
|
&& _startPos>0) {
|
||||||
if (_escapeChar == (char32_t)_SearchIn[_startPos-1]) {
|
if (_escapeChar == (char32_t)_SearchIn[_startPos-1]) {
|
||||||
|
@ -198,13 +198,18 @@ void testRegExpSingle(const std::string& _expression, const std::string& _search
|
|||||||
}
|
}
|
||||||
|
|
||||||
void testRegExp() {
|
void testRegExp() {
|
||||||
std::string data = " a /* plop */ \n int eee = 22; // error value \nint main(void) {\n return 0;\n}\n";
|
//std::string data = " a /* plop */ \n int eee = 22; // error value \nint main(void) {\n return 0;\n}\n";
|
||||||
//std::string data = "alpha /* plop */ test";
|
//std::string data = "alpha /* plop */ test";
|
||||||
//std::string data = "pp \n // qdfqdfsdf \nde";
|
//std::string data = "pp \n // qdfqdfsdf \nde";
|
||||||
testRegExpSingle("/\\*.*\\*/", data);
|
//testRegExpSingle("/\\*.*\\*/", data);
|
||||||
//testRegExpSingle("//.*$", data);
|
//testRegExpSingle("//.*$", data);
|
||||||
//testRegExpSingle("/\\*.*", data);
|
//testRegExpSingle("/\\*.*", data);
|
||||||
//testRegExpSingle("[a-z]", data);
|
//testRegExpSingle("[a-z]", data);
|
||||||
|
//std::string data = " eesd a lzzml plophzzzzzhhhhhrlkmlkml";
|
||||||
|
//testRegExpSingle("a.*plop(z{2,3}|h+)+r", data);
|
||||||
|
|
||||||
|
std::string data = "pp \n# plop // qdfqdfsdf \nde";
|
||||||
|
testRegExpSingle("#(\\\\\\\\|\\\\\\n|.)*$", data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char *argv[]) {
|
int main(int argc, const char *argv[]) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user