From 5cb5229e438f84e8e30ea93556004f384c3a0b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Mon, 6 Nov 2017 10:56:19 +0100 Subject: [PATCH] Basic version of the parsercheck utility --- demo.srd | 2 +- ebcl | 2 +- parsercheck.cc | 81 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 82 insertions(+), 3 deletions(-) diff --git a/demo.srd b/demo.srd index ba0aa66..9cc6023 100644 --- a/demo.srd +++ b/demo.srd @@ -86,7 +86,7 @@ (get-input dof-falloff) (get-input dof-max-blur) )) - (set-uniforms prog 3 ((get-input dof-samples)) + (set-uniforms prog 3 ((get-input dof-samples))) (set-uniforms prog 4 (vp-width vp-height time)) ) diff --git a/ebcl b/ebcl index 073fcb3..3adfdad 160000 --- a/ebcl +++ b/ebcl @@ -1 +1 @@ -Subproject commit 073fcb3d5e9366de941ebce73a42cbf3c7686b4d +Subproject commit 3adfdadd119f2783877865a8365a29d4b567911f diff --git a/parsercheck.cc b/parsercheck.cc index 387c9aa..6da818a 100644 --- a/parsercheck.cc +++ b/parsercheck.cc @@ -1,3 +1,82 @@ -int main( ) +#include "externals.hh" +#include "opast.hh" +#include +#include + +using namespace ebcl; +using namespace opast; + +namespace { + +void PrintStreamError( + char const* const prefix , + T_String const& name , + X_StreamError const& error ) { + T_StringBuilder sb; + sb << prefix << " '" << name << "': " << error.what( ); + if ( error.code( ) == E_StreamError::SYSTEM_ERROR ) { + sb << " (error code " << error.systemError( ) << ")"; + } + sb << '\n' << '\0'; + fprintf( stderr , "%s" , sb.data( ) ); +} + +void WriteSRDError( + T_StringBuilder& sb , + T_SRDError const& error ) +{ + sb << error.location( ) << " - " << error.error( ) << "\n"; +} + + +} // namespace + +int main( int argc , char** argv ) +{ + // Open file + const T_String inputName( argc >= 2 ? argv[ 1 ] : "demo.srd" ); + T_File input( inputName , E_FileMode::READ_ONLY ); + try { + input.open( ); + } catch ( X_StreamError const& e ) { + PrintStreamError( "Could not open" , inputName , e ); + return 1; + } + + // Load SRD data + T_SRDMemoryTarget srdOut; + srdOut.clearComments( true ).clearFlushToken( true ); + try { + T_SRDTextReader srdReader{ srdOut }; + T_FileInputStream fis{ input }; + srdReader.read( inputName , fis ); + } catch ( X_StreamError const& e ) { + PrintStreamError( "Could not open" , inputName , e ); + return 1; + } catch ( X_SRDErrors const& e ) { + T_StringBuilder sb; + const auto nErrors( e.errors.size( ) ); + for ( auto i = 0u ; i < nErrors ; i ++ ) { + WriteSRDError( sb , e.errors[ i ] ); + } + sb << "No parsing happened due to format errors\n" << '\0'; + fprintf( stderr , "%s" , sb.data( ) ); + return 2; + } + + // Parse the fuck + T_Parser parser; + if ( parser.parse( srdOut.list( ) ) ) { + printf( "Success!\n" ); + return 0; + } else { + T_StringBuilder sb; + for ( auto const& err : parser.errors( ) ) { + WriteSRDError( sb , err ); + } + sb << "Parser failed\n" << '\0'; + fprintf( stderr , "%s" , sb.data( ) ); + return 3; + } }