FANDOM


/*
 * Przykład parsera zstępującego w C.
 * Program wykonuje podstawowe działania na liczbach całkowitych:
 * Założona gramatyka w notacji BNF:
 * <wyrażenie> ::= <składnik> | 
 *	<wyrażenie> '+' <składnik> |
 * 	<wyrażenie> '-' <składnik>
 * <składnik> ::= <czynnik> |
 * 	<składnik> '*' <czynnik> |
 * 	<składnik> '/' <czynnik>
 * <czynnik> ::= <liczba> | '(' <wyrażenie> ')'
 * <liczba> ::= <cyfra> | <liczba> <cyfra>
 * <cyfra> ::= '0' | ... | '9'
 *
 * Dla przejrzystości pominięto obsługę błędów.
 * 
 * Autor: Łukasz Mielicki
 *  Data: 04.09.2006
 */
#include <stdio.h>
#include <ctype.h>

char nextc;        /* Tutaj jest zawsze nastepny znak. */

int wyrazenie(void);

int cyfra(void) {
    int val;
    val = nextc - '0';
    nextc = getchar();
    return val;
}

int liczba(void) {
    int val = 0;
    while (isdigit(nextc)) {
        val *= 10;
        val += cyfra();
    }
    return val;
}

int czynnik(void) {
    int val;
    if (nextc == '(') {
        nextc = getchar();
        val = wyrazenie();
        nextc = getchar();	/* ')' */
    } else {
        val = liczba();
    }
    return val;
}

int skladnik(void) {
    int val;
    val = czynnik();
    while (nextc == '*' || nextc == '/') {
        if (nextc == '*') {
            nextc = getchar();
            val *= czynnik();
        } else {    /* nextc == '/' */
            nextc = getchar();
            val /= czynnik();
        }
    }
    return val;
}

int wyrazenie(void) {
    int val;
    val = skladnik();
    while (nextc == '+' || nextc == '-') {
        if (nextc == '+') {
            nextc = getchar();
            val += skladnik();
        } else {    /* nextc == '-' */
            nextc = getchar();
            val -= skladnik();
        }
    }
    return val;
}

int main(void) {
    int val;
    nextc = getchar();
    val = wyrazenie();
    printf(" = %d\n", val);
    return 0;
}

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Więcej z Fandomu

Losowa wiki