ADDED: expression support in min/max/opt values.

This commit is contained in:
Jeff Young 2025-06-22 14:56:32 -06:00
parent a382fd3064
commit 38f4a21b96
2 changed files with 41 additions and 29 deletions

View File

@ -73,7 +73,7 @@ void DRC_RULES_PARSER::reportError( const wxString& aMessage )
} }
void DRC_RULES_PARSER::reportDeprecation( const wxString& oldToken, const wxString newToken ) void DRC_RULES_PARSER::reportDeprecation( const wxString& oldToken, const wxString& newToken )
{ {
if( m_reporter ) if( m_reporter )
{ {
@ -105,6 +105,29 @@ void DRC_RULES_PARSER::parseUnknown()
} }
wxString DRC_RULES_PARSER::parseExpression()
{
wxString expr;
int depth = 1;
for( T token = NextTok(); token != T_EOF; token = NextTok() )
{
if( token == T_LEFT )
depth++;
if( token == T_RIGHT )
{
if( --depth == 0 )
break;
}
expr += FromUTF8();
}
return expr;
}
void DRC_RULES_PARSER::Parse( std::vector<std::shared_ptr<DRC_RULE>>& aRules, REPORTER* aReporter ) void DRC_RULES_PARSER::Parse( std::vector<std::shared_ptr<DRC_RULE>>& aRules, REPORTER* aReporter )
{ {
bool haveVersion = false; bool haveVersion = false;
@ -696,76 +719,64 @@ void DRC_RULES_PARSER::parseConstraint( DRC_RULE* aRule )
break; break;
case T_min: case T_min:
token = NextTok(); {
wxString expr = parseExpression();
if( (int) token == DSN_RIGHT ) if( expr.IsEmpty() )
{ {
reportError( _( "Missing min value." ) ); reportError( _( "Missing min value." ) );
break; break;
} }
parseValueWithUnits( FromUTF8(), value, units, unitless ); parseValueWithUnits( expr, value, units, unitless );
validateAndSetValueWithUnits( value, units, validateAndSetValueWithUnits( value, units,
[&c]( const int aValue ) [&c]( const int aValue )
{ {
c.m_Value.SetMin( aValue ); c.m_Value.SetMin( aValue );
} ); } );
if( (int) NextTok() != DSN_RIGHT )
{
reportError( wxString::Format( _( "Unrecognized item '%s'." ), FromUTF8() ) );
parseUnknown();
}
break; break;
}
case T_max: case T_max:
token = NextTok(); {
wxString expr = parseExpression();
if( (int) token == DSN_RIGHT ) if( expr.IsEmpty() )
{ {
reportError( _( "Missing max value." ) ); reportError( _( "Missing max value." ) );
break; break;
} }
parseValueWithUnits( FromUTF8(), value, units, unitless ); parseValueWithUnits( expr, value, units, unitless );
validateAndSetValueWithUnits( value, units, validateAndSetValueWithUnits( value, units,
[&c]( const int aValue ) [&c]( const int aValue )
{ {
c.m_Value.SetMax( aValue ); c.m_Value.SetMax( aValue );
} ); } );
if( (int) NextTok() != DSN_RIGHT )
{
reportError( wxString::Format( _( "Unrecognized item '%s'." ), FromUTF8() ) );
parseUnknown();
}
break; break;
}
case T_opt: case T_opt:
token = NextTok(); {
wxString expr = parseExpression();
if( (int) token == DSN_RIGHT ) if( expr.IsEmpty() )
{ {
reportError( _( "Missing opt value." ) ); reportError( _( "Missing opt value." ) );
break; break;
} }
parseValueWithUnits( FromUTF8(), value, units, unitless ); parseValueWithUnits( expr, value, units, unitless );
validateAndSetValueWithUnits( value, units, validateAndSetValueWithUnits( value, units,
[&c]( const int aValue ) [&c]( const int aValue )
{ {
c.m_Value.SetOpt( aValue ); c.m_Value.SetOpt( aValue );
} ); } );
if( (int) NextTok() != DSN_RIGHT )
{
reportError( wxString::Format( _( "Unrecognized item '%s'." ), FromUTF8() ) );
parseUnknown();
}
break; break;
}
case T_EOF: case T_EOF:
reportError( _( "Incomplete statement." ) ); reportError( _( "Incomplete statement." ) );

View File

@ -59,9 +59,10 @@ private:
LSET parseLayer( wxString* aSource ); LSET parseLayer( wxString* aSource );
SEVERITY parseSeverity(); SEVERITY parseSeverity();
void parseUnknown(); void parseUnknown();
wxString parseExpression();
void reportError( const wxString& aMessage ); void reportError( const wxString& aMessage );
void reportDeprecation( const wxString& oldToken, const wxString newToken ); void reportDeprecation( const wxString& oldToken, const wxString& newToken );
private: private:
int m_requiredVersion; int m_requiredVersion;