libeval_compiler: fixed segfault for "(number)" expressions.
This commit is contained in:
parent
a5a06e3c89
commit
c88c8102e5
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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<bool( wxUniChar )> 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,7 +341,6 @@ 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;
|
||||
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue