Fix missing 'else' and EOF processing, both of which cause crashes.

This commit is contained in:
Jeff Young 2020-08-14 20:42:21 +01:00
parent 94ef2781bf
commit ec5040aff5
3 changed files with 31 additions and 9 deletions

View File

@ -759,8 +759,7 @@ bool COMPILER::generateUCode( UCODE* aCode, CONTEXT* aPreflightContext )
msg.Printf( _( "Unrecognized item '%s'" ), itemName );
reportError( CST_CODEGEN, msg, node->leaf[0]->srcPos - (int) itemName.length() );
}
if( vref->GetType() == VT_PARSE_ERROR )
else if( vref->GetType() == VT_PARSE_ERROR )
{
msg.Printf( _( "Unrecognized property '%s'" ), propName );
reportError( CST_CODEGEN, msg, node->leaf[1]->srcPos - (int) propName.length() );

View File

@ -37,7 +37,6 @@ using namespace DRCRULE_T;
DRC_RULES_PARSER::DRC_RULES_PARSER( BOARD* aBoard, const wxString& aSource,
const wxString& aSourceDescr ) :
DRC_RULES_LEXER( aSource.ToStdString(), aSourceDescr ),
m_board( aBoard ),
m_requiredVersion( 0 ),
m_tooRecent( false ),
m_reporter( nullptr )
@ -47,7 +46,6 @@ DRC_RULES_PARSER::DRC_RULES_PARSER( BOARD* aBoard, const wxString& aSource,
DRC_RULES_PARSER::DRC_RULES_PARSER( BOARD* aBoard, FILE* aFile, const wxString& aFilename ) :
DRC_RULES_LEXER( aFile, aFilename ),
m_board( aBoard ),
m_requiredVersion( 0 ),
m_tooRecent( false ),
m_reporter( nullptr )
@ -144,6 +142,10 @@ void DRC_RULES_PARSER::Parse( std::vector<DRC_RULE*>& aRules, REPORTER* aReporte
aRules.push_back( parseDRC_RULE() );
break;
case T_EOF:
reportError( _( "Incomplete statement." ) );
break;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(), "'rule', 'version'" );
@ -170,7 +172,7 @@ DRC_RULE* DRC_RULES_PARSER::parseDRC_RULE()
rule->m_Name = FromUTF8();
for( token = NextTok(); token != T_RIGHT; token = NextTok() )
for( token = NextTok(); token != T_RIGHT && token != T_EOF; token = NextTok() )
{
if( token != T_LEFT )
reportError( _( "Missing '('." ) );
@ -216,6 +218,10 @@ DRC_RULE* DRC_RULES_PARSER::parseDRC_RULE()
rule->m_LayerCondition = parseLayer();
break;
case T_EOF:
reportError( _( "Incomplete statement." ) );
return rule;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(),
@ -225,6 +231,9 @@ DRC_RULE* DRC_RULES_PARSER::parseDRC_RULE()
}
}
if( (int) CurTok() != DSN_RIGHT )
reportError( _( "Missing ')'." ) );
return rule;
}
@ -239,7 +248,7 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
T token = NextTok();
if( (int) token == DSN_RIGHT )
if( (int) token == DSN_RIGHT || token == T_EOF )
{
msg.Printf( _( "Missing constraint type.| Expected %s." ),
"'clearance', 'track_width', 'annulus_width', 'hole', 'disallow'" );
@ -281,6 +290,11 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
case T_graphic: constraint.m_DisallowFlags |= DISALLOW_GRAPHICS; break;
case T_hole: constraint.m_DisallowFlags |= DISALLOW_HOLES; break;
case T_footprint: constraint.m_DisallowFlags |= DISALLOW_FOOTPRINTS; break;
case T_EOF:
reportError( _( "Missing ')'." ) );
return;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(),
@ -288,14 +302,17 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
"'blind_via', 'pad', 'zone', 'text', 'graphic', 'hole'."
);
reportError( msg );
parseUnknown();
break;
}
}
if( (int) CurTok() != DSN_RIGHT )
reportError( _( "Missing ')'." ) );
return;
}
for( token = NextTok(); token != T_RIGHT; token = NextTok() )
for( token = NextTok(); token != T_RIGHT && token != T_EOF; token = NextTok() )
{
if( token != T_LEFT )
reportError( _( "Missing '('." ) );
@ -364,6 +381,10 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
break;
case T_EOF:
reportError( _( "Incomplete statement." ) );
return;
default:
msg.Printf( _( "Unrecognized item '%s'.| Expected %s." ),
FromUTF8(), "'min', 'max', 'opt'" );
@ -371,6 +392,9 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
parseUnknown();
}
}
if( (int) CurTok() != DSN_RIGHT )
reportError( _( "Missing ')'." ) );
}

View File

@ -56,7 +56,6 @@ private:
void reportError( const wxString& aMessage );
private:
BOARD* m_board;
int m_requiredVersion;
bool m_tooRecent;
REPORTER* m_reporter;