That Guy
Meubilair
- Lid geworden
- 28 nov 2006
- Berichten
- 5.010
Hello!,
Ik ben al een tijdje bezig met een lexer te schrijven voor een javascript/c/c++ achtige taal. Nu wou ik m'n subroutine om getallen te lexen eens wat korter/mooier/duidelijker maken, dus dacht ik, waarom niet wat klooien met de pp. Zie hier:
[CPP]Token * numeric_token()
{
char current_character;
std::string number;
bool fraction = false,
is_hex = false;
#define IS_ALLOWED_CHARACTER(c) ( isdigit(c) )
while( chars_available() && (current_character = get_char()) && IS_ALLOWED_CHARACTER(current_character) )
{
buffer_index++;
number += current_character;
#define IS_ALLOWED_CHARACTER(c) ( isdigit(c) || c == '.' || c == 'x' )
if( current_character == 'x' )
{
if( is_hex ) // "0x" en dan nog ergens een x is geen valide hex nummer
{
throw Exception("invalid number: '" + number + "'");
}else{
is_hex = true;
#define IS_ALLOWED_CHARACTER(c) ( isxdigit(c) )
}
}
if( current_character == '.' )
{
if( fraction ) // als het een float is en er komt een punt achter, zal dat vast een methode zijn ( e.g. 3.14.toString() )
{
break; // done
}else{
fraction = true;
#define IS_ALLOWED_CHARACTER(c) ( isdigit(c) )
}
}
}
#undef IS_ALLOWED_CHARACTER
return new Token( '...' );
}[/CPP]
(lichtelijk gestript)
Het idee is dat 'ie de volgende 'type' getallen parsed:
Nu is het probleem... het werkt niet. Kan het kloppen dat de #defines die IN de while zitten, niet uitgevoerd worden? Iemand een idee?
Groet en alvast bedankt.
Ik ben al een tijdje bezig met een lexer te schrijven voor een javascript/c/c++ achtige taal. Nu wou ik m'n subroutine om getallen te lexen eens wat korter/mooier/duidelijker maken, dus dacht ik, waarom niet wat klooien met de pp. Zie hier:
[CPP]Token * numeric_token()
{
char current_character;
std::string number;
bool fraction = false,
is_hex = false;
#define IS_ALLOWED_CHARACTER(c) ( isdigit(c) )
while( chars_available() && (current_character = get_char()) && IS_ALLOWED_CHARACTER(current_character) )
{
buffer_index++;
number += current_character;
#define IS_ALLOWED_CHARACTER(c) ( isdigit(c) || c == '.' || c == 'x' )
if( current_character == 'x' )
{
if( is_hex ) // "0x" en dan nog ergens een x is geen valide hex nummer
{
throw Exception("invalid number: '" + number + "'");
}else{
is_hex = true;
#define IS_ALLOWED_CHARACTER(c) ( isxdigit(c) )
}
}
if( current_character == '.' )
{
if( fraction ) // als het een float is en er komt een punt achter, zal dat vast een methode zijn ( e.g. 3.14.toString() )
{
break; // done
}else{
fraction = true;
#define IS_ALLOWED_CHARACTER(c) ( isdigit(c) )
}
}
}
#undef IS_ALLOWED_CHARACTER
return new Token( '...' );
}[/CPP]
(lichtelijk gestript)
Het idee is dat 'ie de volgende 'type' getallen parsed:
Code:
3 (int)
3.14 (float)
0x42 (hex)
Groet en alvast bedankt.
Laatst bewerkt: