Ein Parser für einfache Ausdrücke in C (Ein Parser für einfache Ausdrücke in C), Lektion, Seite 724295
https://www.purl.org/stefan_ram/pub/parser_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

Ein Parser für einfache Ausdrücke in C

#include <stdio.h>

#include <math.h>

#include <string.h>

double xpow( double const x, double const y ){ return pow( x, y ); }

double xmul( double const x, double const y ){ return x * y; }

double xdiv( double const x, double const y ){ return x / y; }

double xadd( double const x, double const y ){ return x + y; }

double xsub( double const x, double const y ){ return x - y; }

typedef double( *operator )( double, double );

struct ex { char name; operator op; int left; }ex[] =

{ { 0, 0, 0 }, { '^', xpow, 0 },{ '*', xmul, 1 },{ '/', xdiv, 1 },

{ '+', xadd, 1 },{ '-', xsub, 1 }};

struct ex lookup( char const name )

{ for( size_t i = 0; i < sizeof ex/sizeof 0[ ex ]; ++i )

if( ex[ i ].name == name )return ex[ i ]; return ex[ 0 ]; }

char const * g = 0; char get(){ return *g++; }

char peek(){ return *g; }

char check( char const * const op )

{ return strchr( op, peek() ) ?get(): 0; }

double numeral(){ return get() - '0'; }

double prefix(){ int sign = 1;

while( '-' == peek() ){ get(); sign *= -1; }

return sign * numeral(); }

double parse( char const * const op, double( *next ) () )

{ double result =( *next )();

for( char sym; sym = check( op ); )result = lookup( sym ).op

( result, lookup( sym ).left?( next )(): parse( op, next ));

return result; }

double power(){ return parse( "^", prefix ); }

double product(){ return parse( "/*", power ); }

double sum(){ return parse( "+-", product ); }

double start(){ return sum(); }

void test( char const * s ){ g = s; printf( "%g\n", start() ); }

int main( void ){ test( "2^2^3/2/2" ); test( "2+2*2^2^-3" ); }

64

4.18102

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724295 stefan_ram:724295 Ein Parser für einfache Ausdrücke in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724295, slrprddef724295, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/parser_c