%{ USES YaccLib, LexLib; TYPE stringN=string[8]; VAR info:array[1..20] of record nom:stringN; verbe:integer; compl:stringN; end; (* la table des noms et infos relatives *) compteur:byte; FUNCTION VerbToNumber(s:string):byte; Begin if s='est marie a' then VerbToNumber:=1 else if s='est mariee a' then VerbToNumber:=2 else if s='est le frere de' then VerbToNumber:=3 else if s='est la soeur de' then VerbToNumber:=4 else if s='est le pere de' then VerbToNumber:=5 else if s='est la mere de' then VerbToNumber:=6; End; FUNCTION NumberToVerb(i:byte):string; Begin case i of 1: NumberToVerb:='est marie a'; 2: NumberToVerb:='est mariee a'; 3: NumberToVerb:='est le frere de'; 4: NumberToVerb:='est la soeur de'; 5: NumberToVerb:='est le pere de'; 6: NumberToVerb:='est la mere de'; end; End; PROCEDURE DonneInfo(s:stringN); var j:byte; Begin writeln;writeln('Info du KGB : '); for j:=1 to compteur do if (info[j].nom=s) or (info[j].compl=s) then writeln(info[j].nom,' ',NumberToVerb(info[j].verbe),' ',info[j].compl); End; PROCEDURE StockInfo(s1:stringN;i:byte;s3:stringN); Begin inc(compteur); info[compteur].nom:=s1; info[compteur].verbe:=i; info[compteur].compl:=s3; End; %} %token IdNom /* nom */ %token IdVerbe /* verbe */ %token IdQui %type phrase /* phrase */ %type nom, complement, sujet %type verbe %% input : |input '\n' { } | input phrase { } | error '\n' { yyerrok; } phrase : affirmation | interrogation affirmation : sujet verbe complement {StockInfo($1,$2,$3);} interrogation : IdQui nom '\?' {DonneInfo($2);} sujet : nom verbe : IdVerbe {$$:=VerbToNumber(yytext);} complement : nom nom : IdNom {$$:=yytext;} %% {$I tp5lex} BEGIN compteur:=0; writeln('Tapez exit pour sortir'); if yyparse=0 then (* fini ! *); END.