Otóż mam :
Zaprojektować składnię instrukcji switch, lecz użycie rekursji lewostronnej i produkcji wycierających obniża ocenę.
Oto legenda:
L = cyfra | L cyfra // liczba
Z = litera | Z litera | Z cyfra | Z '_' // zmienna
- = '+' | '-' // operatory addytywne
- = '*' | '/' // operatory multiplikatywne
= '' // operator potęgowania
@ = '@' // należenie do zbioru
$ = '@@' // zawieranie zbiorów
[ = '[' // zbiór - początek
] = ']' // zbiór - koniec
, = ',' // oddzielenie w liście
U = 'U' // suma zbiorów
P = 'P' // przecięcie zbiorów
R = '<' | '>' | '==' | '<>' | '>=' | '<=' // relacje
( = '(' // lewy nawias
) = ')' // prawy nawias
& = '&&' // iloczyn logiczny
| = '||' // suma logiczna
! = '!' // negacja logiczna
I = 'if' // słowo kluczowe if
E = 'else' // słowo kluczowe else
F = 'for' // słowo kluczowe for
W = 'while' // słowo kluczowe while
D = 'do' // słowo kluczowe do
S = 'switch' // słowo kluczowe switch
C = 'case' // słowo kluczowe case
B = 'break' // słowo kluczowe break
T = 'default' // słowo kluczowe default
{ = '{' // lewy nawias instrukcyjny
} = '}' // prawy nawias instrukcyjny
; = ';' // średnik
: = ':' // dwukropek
Wstępnie zrobiłem to tak:
SWITCH = S( WYRAZENIE ) { WNETRZE }
WYRAZENIE = L
WYRAZENIE = Z
WYRAZENIE = ( WYRAZENIE )
WYRAZENIE = WYRAZENIE + WYRAZENIE
WYRAZENIE = WYRAZENIE * WYRAZENIE
WYRAZENIE = SWITCH
WYRAZENIE = WYRAZENIE - WYRAZENIE
WYRAZENIE = WYRAZENIE / WYRAZENIE
WYRAZENIE = WYRAZENIE ^ WYRAZENIE
WYRAZENIE = WYRAZENIE R WYRAZENIE
WYRAZENIE = WYRAZENIE && WYRAZENIE
WYRAZENIE = WYRAZENIE || WYRAZENIE
WNETRZE = C L : INSTRUKCJE ; DALEJ
WNETRZE = KIEDY : INSTRUKCJE ; DALEJ
INSTRUKCJE = WYRAZENIE
KIEDY = C L
KIEDY = T
DALEJ = B ;
DALEJ = ; WNETRZE
lecz to chyba jest zrobione rekurencją lewostronną i chyba nie wszystko dozwolone, jakby ktoś mi pomógł to poprawić to byłbym bardzo wdzięczny. Pozdrawiam.