diff --git a/common/libeval_compiler/grammar.lemon b/common/libeval_compiler/grammar.lemon index 99f107d94a..738f185bb9 100644 --- a/common/libeval_compiler/grammar.lemon +++ b/common/libeval_compiler/grammar.lemon @@ -172,7 +172,7 @@ nt(A) ::= nt(B) G_STRUCT_REF nt(C). nt(A) ::= G_PARENL nt(B) G_PARENR. { - A = newNode( pEval, B->op ); + A = newNode( pEval, B->op, B->value ); A->leaf[0] = B->leaf[0]; A->leaf[1] = B->leaf[1]; } diff --git a/common/libeval_compiler/libeval_compiler.cpp b/common/libeval_compiler/libeval_compiler.cpp index 969817d1c3..569db09fb3 100644 --- a/common/libeval_compiler/libeval_compiler.cpp +++ b/common/libeval_compiler/libeval_compiler.cpp @@ -68,6 +68,8 @@ TREE_NODE* newNode( LIBEVAL::COMPILER* compiler, int op, const T_TOKEN_VALUE& va t2->srcPos = compiler->GetSourcePos(); t2->uop = nullptr; + libeval_dbg(10, " ostr %p nstr %p nnode %p op %d", value.str, t2->value.str, t2, t2->op ); + if(t2->value.str) compiler->GcItem( t2->value.str ); @@ -145,7 +147,6 @@ UCODE::~UCODE() { for ( auto op : m_ucode ) { - printf("destroy uop %p\n", op ); delete op; } } @@ -169,7 +170,6 @@ wxString TOKENIZER::GetChars( std::function cond ) const { wxString rv; size_t p = m_pos; - // printf("p %d len %d\n", p, str.length() ); while( p < m_str.length() && cond( m_str[p] ) ) { @@ -287,7 +287,7 @@ bool COMPILER::Compile( const wxString& aString, UCODE* aCode, CONTEXT* aPreflig if( tok.value.str ) GcItem( tok.value.str ); - libeval_dbg(10, "parse: tok %d\n", tok.token ); + libeval_dbg(10, "parse: tok %d valstr %p\n", tok.token, tok.value.str ); Parse( m_parser, tok.token, tok, this ); if ( m_errorStatus.pendingError ) @@ -332,7 +332,6 @@ T_TOKEN COMPILER::getToken() done = lexString( rv ); break; } - //printf( "-> lstate %d done %d\n", m_lexerState, !!done ); } while( !done ); return rv; @@ -342,8 +341,7 @@ T_TOKEN COMPILER::getToken() bool COMPILER::lexString( T_TOKEN& aToken ) { wxString str = m_tokenizer.GetChars( []( int c ) -> bool { return c != '\''; } ); - //printf("STR LIT '%s'\n", (const char *)str.c_str() ); - + aToken.token = G_STRING; aToken.value.str = new wxString( str ); @@ -383,7 +381,6 @@ bool COMPILER::lexDefault( T_TOKEN& aToken ) retval.value.str = nullptr; retval.token = G_ENDS; - //printf( "tokdone %d\n", !!m_tokenizer.Done() ); if( m_tokenizer.Done() ) { aToken = retval; @@ -423,8 +420,6 @@ bool COMPILER::lexDefault( T_TOKEN& aToken ) if( isDecimalSeparator( current[i - 1] ) ) current[i - 1] = m_localeDecimalSeparator; } - - //printf("-> NUM: '%s'\n", (const char *) current.c_str() ); }; @@ -456,7 +451,6 @@ bool COMPILER::lexDefault( T_TOKEN& aToken ) } else if( ( convertFrom = resolveUnits() ) >= 0 ) { - //printf("unit\n"); // UNIT // Units are appended to a VALUE. // Determine factor to default unit if unit for value is given. @@ -468,18 +462,13 @@ bool COMPILER::lexDefault( T_TOKEN& aToken ) } else if( ch == '\'' ) // string literal { - //printf( "MATCH STRING LITERAL\n" ); m_lexerState = LS_STRING; m_tokenizer.NextChar(); return false; } else if( isalpha( ch ) || ch == '_' ) { - //printf("ALPHA\n"); current = m_tokenizer.GetChars( []( int c ) -> bool { return isalnum( c ) || c == '_'; } ); - //printf("Len: %d\n", current.length() ); - //printf("id '%s'\n", (const char *) current.c_str() ); - //fflush( stdout ); retval.token = G_IDENTIFIER; retval.value.str = new wxString( current ); m_tokenizer.NextChar( current.length() ); @@ -546,7 +535,7 @@ bool COMPILER::lexDefault( T_TOKEN& aToken ) const wxString formatNode( TREE_NODE* node ) { - return *(node->value.str); + return node->value.str ? *(node->value.str) : ""; } @@ -655,8 +644,6 @@ void COMPILER::setRoot( TREE_NODE *root ) void COMPILER::freeTree( LIBEVAL::TREE_NODE *tree ) { - printf("->FreeTre %p\n", tree ); - if ( tree->leaf[0] ) freeTree( tree->leaf[0] ); if ( tree->leaf[1] ) @@ -664,14 +651,8 @@ void COMPILER::freeTree( LIBEVAL::TREE_NODE *tree ) if( tree->uop ) { - printf("Free uop %p\n", tree->uop ); delete tree->uop; } - -/* if( tree->value.str ) - delete tree->value.str; - - delete tree;*/ } void TREE_NODE::SetUop( int aOp, double aValue ) @@ -856,7 +837,6 @@ bool COMPILER::generateUCode( UCODE* aCode, CONTEXT* aPreflightContext ) if( son && son->op == TR_UNIT ) { - //printf( "HandleUnit: %s unit %d\n", node->value.str, son->value.type ); int units = son->value.idx; value = m_unitResolver->Convert( *node->value.str, units ); visitedNodes.insert( son ); @@ -946,7 +926,6 @@ void UOP::Exec( CONTEXT* ctx ) return; case TR_OP_METHOD_CALL: - //printf("CALL METHOD %s\n" ); m_func( ctx, m_ref.get() ); return; diff --git a/thirdparty/lemon/lempar.c b/thirdparty/lemon/lempar.c index 704ff501b6..c9a8e7617a 100644 --- a/thirdparty/lemon/lempar.c +++ b/thirdparty/lemon/lempar.c @@ -1136,7 +1136,7 @@ static YYACTIONTYPE yy_reduce( case 18: /* nt ::= G_PARENL nt G_PARENR */ #line 174 "grammar.lemon" { - yymsp[-2].minor.yy31 = newNode( pEval, yymsp[-1].minor.yy31->op ); + yymsp[-2].minor.yy31 = newNode( pEval, yymsp[-1].minor.yy31->op, yymsp[-1].minor.yy31->value ); yymsp[-2].minor.yy31->leaf[0] = yymsp[-1].minor.yy31->leaf[0]; yymsp[-2].minor.yy31->leaf[1] = yymsp[-1].minor.yy31->leaf[1]; }