RecDescent ist zu gierig
Maik Görgens
- perl
Hallo!
Ich versuch grad (zum ersten mal, deshalb bitte entschuldigen, das es nicht grad elegant ist) mit Parse::RecDescent zu arbeiten. Hier erstmal der Beispiel-Code:
use Parse::RecDescent;
open(GRAMMAR, '<grammar'); my $grammar = join('', <GRAMMAR>); close(GRAMMAR);
$grammar="
test: 'eins' subrule1(?) subrule2(?) /\Z/ | <error>
subrule1: 'zwei' optional(?)
optional: 'klau'
subrule2: 'klau' 'mich'
";
my $parser = new Parse::RecDescent($grammar);
$test = 'eins zwei klau mich';
$parser->test($test);
Wenn ich das so ausführe kommt
ERROR (line 1): Invalid test: Was expecting /\Z/ but found "mich"
instead
Eigentlich sollte es aber so sein (zumindest ist das meine Absicht) das er den Text so nimmt. Das Problem ist, das der 'klau' schon bei der Regel optional wegnimmt. Dann sieht der ja nur noch 'mich' und muckt rum. Ich will aber, das der das klau wieder hergibt, damit subrule2 klappt. Was ich sagen will, eigentlich könnte das parsen klappen, wenn der nicht so gierig wäre, sondern so lange probieren würde bis es vielleicht doch noch zum Erfolg führt. Für subrule1 stünde dann halt nur 'zwei'. Das optional macht der danach nicht und dann klappt auch subrule2.
Warscheinlich muß ich das halt in der Grammatik anders schreiben. Wißt ihr wie? Oder kann ich das mit den Parse-Recdescent überhaupt nicht ausdrücken?
Vielen Dank für eure Hilfe
Maik