gudn tach!
ich habe jetzt mal bei mir Parse::RecDescent installiert und ein bissl damit rumgespielt. "top-down recursive-descent" heisst wohl, dass das ding nicht intelligent ist und backtracking betreibt, sondern stur von oben nach unten die grammatik abarbeitet und immer die erste passende regel nimmt. (in der doku steht auch was dazu)
deswegen ist symb: '=' | '<' | '<=' | '>' | '>=' | '<>' schlecht, weil im ausdruck '<=' das erste zeichen '<' zwar gefunden wuerde, aber das '=' dann nicht mehr.
kurz: die reihenfolge ist wichtig.
deine urspruengliche grammatik koennte also imho lauten:
predicate: '(' predicate ')' (op predicate)(?) | expression symb (op predicate)(?)
op: and | or
expression: 'foo'
symb: '<=' | '>=' | '<>' | '>' | '=' | '<'
and: /AND/i
or: /OR/i
dann sind z.b. folgenden ausdruecke in der sprache enthalten:
foo=
foo<=
foo>= and foo=
foo>= and foo= or (foo=)
foo>= and foo= or (foo>=)
(foo>=) and foo= or (foo>=)
foo>= and ((foo= or (foo>=)))
(foo>= and ((foo= or (foo>=)))) and foo=
nicht enthalten sind z.b.:
foo=foo
foo or foo
foo>= and foo=> or (foo>=)
(foo>= and ((foo= or (foo>=)))) and or
prost
seth