|
From: <bl...@us...> - 2003-05-04 18:19:30
|
Update of /cvsroot/cpptool/rfta/src/rftaparser
In directory sc8-pr-cvs1:/tmp/cvs-serv31091/src/rftaparser
Modified Files:
rftaparser.dsp
Added Files:
MiniParserTest.cpp MiniParserTest.h
Log Message:
* experimenting with implementation of a simplistic parser framework (akin to Boost.Spirit, but much more simple). Still need to devise how matched parts are returned...
--- NEW FILE: MiniParserTest.cpp ---
// //////////////////////////////////////////////////////////////////////////
// (c)Copyright 2002, Baptiste Lepilleur.
// Created: 2003/05/04
// //////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MiniParserTest.h"
namespace Refactoring
{
RFTAPARSER_TEST_SUITE_REGISTRATION( MiniParserTest );
namespace Testing {
struct MiniParserAsserter : public Asserter<MiniParserAsserter>
{
template<typename Parser>
Xtl::ParseResult parse( const std::string &text,
const Parser &parser )
{
Xtl::Scanner scanner( text.c_str(), text.c_str() + text.length() );
return parser.parse( scanner );
}
template<typename Parser>
void checkParser( const std::string &text,
const Parser &parser,
int expectedEnd = -1 )
{
if ( expectedEnd )
expectedEnd = text.length();
Xtl::ParseResult result = parse( text, parser );
failIf( !result.matched_, "parsing failed" );
checkEquals( text.c_str(), result.matchStart_, "wrong match start" );
checkEquals( text.c_str() + expectedEnd, result.matchEnd_ , "wrong match end" );
}
template<typename Parser>
void checkParserFail( const std::string &text,
const Parser &parser )
{
Xtl::ParseResult result = parse( text, parser );
failIf( result.matched_, "parsing should have failed" );
}
};
#define RFTA_ASSERT_MINIPARSER_PASS \
RFTA_CUSTOM_ASSERT( Refactoring::Testing::MiniParserAsserter ).checkParser
#define RFTA_ASSERT_MINIPARSER_FAIL \
RFTA_CUSTOM_ASSERT( Refactoring::Testing::MiniParserAsserter ).checkParserFail
} // namespace Testing
MiniParserTest::MiniParserTest()
{
}
MiniParserTest::~MiniParserTest()
{
}
void
MiniParserTest::setUp()
{
}
void
MiniParserTest::tearDown()
{
}
void
MiniParserTest::testParseChLit()
{
RFTA_ASSERT_MINIPARSER_PASS( "a", Xtl::CharMiniParser( 'a' ) );
RFTA_ASSERT_MINIPARSER_FAIL( "b", Xtl::CharMiniParser( 'c' ) );
}
void
MiniParserTest::testParseString()
{
RFTA_ASSERT_MINIPARSER_PASS( "abcdef", Xtl::StringMiniParser( "abcdef" ) );
RFTA_ASSERT_MINIPARSER_PASS( "a", Xtl::StringMiniParser( "a" ) );
RFTA_ASSERT_MINIPARSER_PASS( "", Xtl::StringMiniParser( "" ) );
RFTA_ASSERT_MINIPARSER_FAIL( "abcdef", Xtl::StringMiniParser( "abcfgh" ) );
RFTA_ASSERT_MINIPARSER_FAIL( "", Xtl::StringMiniParser( "a" ) );
}
void
MiniParserTest::testParseCppIdentifier()
{
RFTA_ASSERT_MINIPARSER_PASS( "ab_012AC", Xtl::CppIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_PASS( "ABC", Xtl::CppIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_PASS( "a", Xtl::CppIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_PASS( "_", Xtl::CppIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_FAIL( "0", Xtl::CppIdentifierMiniParser() );
}
void
MiniParserTest::testParseMacroIdentifier()
{
RFTA_ASSERT_MINIPARSER_PASS( "A0_DEF", Xtl::MacroIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_PASS( "ABC", Xtl::MacroIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_PASS( "_", Xtl::MacroIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_FAIL( "a_c", Xtl::MacroIdentifierMiniParser() );
RFTA_ASSERT_MINIPARSER_FAIL( "0", Xtl::MacroIdentifierMiniParser() );
}
void
MiniParserTest::testParseSequence()
{
RFTA_ASSERT_MINIPARSER_PASS( "->",
Xtl::makeSequenceParser( Xtl::CharMiniParser( '-' ),
Xtl::StringMiniParser( ">" ) ) );
const Xtl::MiniParser &parser = Xtl::CharMiniParser( '-' ) >> Xtl::CharMiniParser( '>' );
RFTA_ASSERT_MINIPARSER_PASS( "->", parser );
RFTA_ASSERT_MINIPARSER_FAIL( "=>", parser );
const Xtl::MiniParser &parser2 = Xtl::StringMiniParser( "class " )
>> Xtl::CppIdentifierMiniParser()
>> Xtl::CharMiniParser( ':' );
RFTA_ASSERT_MINIPARSER_PASS( "class SourceRange:", parser2 );
RFTA_ASSERT_MINIPARSER_FAIL( "class SourceRange{", parser2 );
}
void
MiniParserTest::testParseOptional()
{
RFTA_ASSERT_MINIPARSER_PASS( "a", Xtl::makeOptionalParser( Xtl::CharMiniParser( 'a' ) ) );
RFTA_ASSERT_MINIPARSER_PASS( "ba", Xtl::makeOptionalParser( Xtl::CharMiniParser( 'a' ) ), 0 );
RFTA_ASSERT_MINIPARSER_PASS( "", Xtl::makeOptionalParser( Xtl::CharMiniParser( 'a' ) ) );
RFTA_ASSERT_MINIPARSER_PASS( "a", !Xtl::CharMiniParser( 'a' ) );
RFTA_ASSERT_MINIPARSER_PASS( "b", !Xtl::CharMiniParser( 'a' ), 0 );
RFTA_ASSERT_MINIPARSER_PASS( "", !Xtl::CharMiniParser( 'a' ) );
}
void
MiniParserTest::testParseAlternative()
{
const Xtl::MiniParser &parser = Xtl::makeAlternativeParser( Xtl::CharMiniParser( '-' ),
Xtl::CharMiniParser( '>' ) );
RFTA_ASSERT_MINIPARSER_PASS( "-", parser );
RFTA_ASSERT_MINIPARSER_PASS( ">", parser );
RFTA_ASSERT_MINIPARSER_FAIL( "+", parser );
RFTA_ASSERT_MINIPARSER_FAIL( "", parser );
const Xtl::MiniParser &parser2 = Xtl::CharMiniParser( '-' ) | Xtl::CharMiniParser( '>' );
RFTA_ASSERT_MINIPARSER_PASS( "-", parser2 );
RFTA_ASSERT_MINIPARSER_PASS( ">", parser2 );
RFTA_ASSERT_MINIPARSER_FAIL( "+", parser2 );
RFTA_ASSERT_MINIPARSER_FAIL( "", parser2 );
}
} // namespace Refactoring
--- NEW FILE: MiniParserTest.h ---
// //////////////////////////////////////////////////////////////////////////
// (c)Copyright 2002, Baptiste Lepilleur.
// Created: 2003/05/04
// //////////////////////////////////////////////////////////////////////////
#ifndef RFTA_MINIPARSERTEST_H
#define RFTA_MINIPARSERTEST_H
#include "UnitTesting.h"
#include <xtl/MiniParser.h>
namespace Refactoring
{
/// Unit tests for MiniParserTest
class MiniParserTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( MiniParserTest );
CPPUNIT_TEST( testParseChLit );
CPPUNIT_TEST( testParseString );
CPPUNIT_TEST( testParseCppIdentifier );
CPPUNIT_TEST( testParseMacroIdentifier );
CPPUNIT_TEST( testParseSequence );
CPPUNIT_TEST( testParseOptional );
CPPUNIT_TEST( testParseAlternative );
CPPUNIT_TEST_SUITE_END();
public:
/*! Constructs a MiniParserTest object.
*/
MiniParserTest();
/// Destructor.
virtual ~MiniParserTest();
void setUp();
void tearDown();
void testParseChLit();
void testParseString();
void testParseCppIdentifier();
void testParseMacroIdentifier();
void testParseSequence();
void testParseOptional();
void testParseAlternative();
private:
};
// Inlines methods for MiniParserTest:
// -----------------------------------
} // namespace Refactoring
#endif // RFTA_MINIPARSERTEST_H
Index: rftaparser.dsp
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/rftaparser/rftaparser.dsp,v
retrieving revision 1.51
retrieving revision 1.52
diff -C2 -d -r1.51 -r1.52
*** rftaparser.dsp 4 May 2003 06:56:09 -0000 1.51
--- rftaparser.dsp 4 May 2003 18:19:28 -0000 1.52
***************
*** 158,161 ****
--- 158,165 ----
# Begin Source File
+ SOURCE=..\..\include\xtl\MiniParser.h
+ # End Source File
+ # Begin Source File
+
SOURCE=..\..\include\xtl\NullEnumerator.h
# End Source File
***************
*** 672,675 ****
--- 676,687 ----
!ENDIF
+ # End Source File
+ # Begin Source File
+
+ SOURCE=.\MiniParserTest.cpp
+ # End Source File
+ # Begin Source File
+
+ SOURCE=.\MiniParserTest.h
# End Source File
# End Group
|