|
@@ -0,0 +1,381 @@
|
|
|
+
|
|
|
+(* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)
|
|
|
+
|
|
|
+(* global definitions: *)
|
|
|
+
|
|
|
+(*
|
|
|
+Vorspann
|
|
|
+ ****************************************************************************)
|
|
|
+
|
|
|
+unit rcparser;
|
|
|
+
|
|
|
+{$modeswitch advancedrecords}
|
|
|
+
|
|
|
+interface
|
|
|
+
|
|
|
+uses
|
|
|
+ SysUtils, Classes, StrUtils, lexlib, yacclib, resource;
|
|
|
+
|
|
|
+function yyparse : Integer;
|
|
|
+
|
|
|
+var
|
|
|
+ aktresources: TResources;
|
|
|
+ opt_code_page: TSystemCodePage;
|
|
|
+ yyfilename: AnsiString;
|
|
|
+ yyparseresult: YYSType;
|
|
|
+
|
|
|
+procedure PragmaCodePage(cp: string);
|
|
|
+
|
|
|
+{$DEFINE INC_HEADER}
|
|
|
+{$I yyinclude.pp}
|
|
|
+{$I yypreproc.pp}
|
|
|
+{$UNDEF INC_HEADER}
|
|
|
+
|
|
|
+implementation
|
|
|
+
|
|
|
+procedure yyerror ( msg : String );
|
|
|
+begin
|
|
|
+ writeln(ErrOutput, yyfilename, '(',yylineno,':',yycolno,'): at "',yytext,'"');
|
|
|
+ WriteLn(ErrOutput, ' ',msg);
|
|
|
+end(*yyerrmsg*);
|
|
|
+
|
|
|
+{$I yyinclude.pp}
|
|
|
+{$I yypreproc.pp}
|
|
|
+
|
|
|
+(* I/O routines: *)
|
|
|
+
|
|
|
+const nl = #10; (* newline character *)
|
|
|
+
|
|
|
+const max_chars = 2048;
|
|
|
+
|
|
|
+var
|
|
|
+ bufptr : Integer;
|
|
|
+ buf : array [1..max_chars] of Char;
|
|
|
+
|
|
|
+function rc_get_char : Char;
|
|
|
+ var i : Integer;
|
|
|
+ ok : boolean;
|
|
|
+ begin
|
|
|
+ if (bufptr=0) and not eof(yyinput) then
|
|
|
+ begin
|
|
|
+ repeat
|
|
|
+ readln(yyinput, yyline);
|
|
|
+ inc(yylineno); yycolno := 1;
|
|
|
+ ok:= ypreproc.useline(yyline);
|
|
|
+ until (ok or eof(yyinput));
|
|
|
+ if ok then begin
|
|
|
+ buf[1] := nl;
|
|
|
+ for i := 1 to length(yyline) do
|
|
|
+ buf[i+1] := yyline[length(yyline)-i+1];
|
|
|
+ inc(bufptr, length(yyline)+1);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ if bufptr>0 then
|
|
|
+ begin
|
|
|
+ rc_get_char := buf[bufptr];
|
|
|
+ dec(bufptr);
|
|
|
+ inc(yycolno);
|
|
|
+ end
|
|
|
+ else
|
|
|
+ rc_get_char := #0;
|
|
|
+ end(*get_char*);
|
|
|
+
|
|
|
+procedure rc_unget_char ( c : Char );
|
|
|
+ begin
|
|
|
+ if bufptr=max_chars then yyerror('input buffer overflow');
|
|
|
+ inc(bufptr);
|
|
|
+ dec(yycolno);
|
|
|
+ buf[bufptr] := c;
|
|
|
+ end(*unget_char*);
|
|
|
+
|
|
|
+procedure unget_string(s: string);
|
|
|
+var
|
|
|
+ i: integer;
|
|
|
+begin
|
|
|
+ for i:= Length(s) downto 1 do
|
|
|
+ rc_unget_char(s[i]);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure PragmaCodePage(cp: string);
|
|
|
+var cpi: integer;
|
|
|
+begin
|
|
|
+ if Uppercase(cp) = 'DEFAULT' then
|
|
|
+ opt_code_page:= DefaultFileSystemCodePage
|
|
|
+ else begin
|
|
|
+ if TryStrToInt(cp, cpi) and (cpi>=0) and (cpi<=high(TSystemCodePage)) then
|
|
|
+ opt_code_page:= cpi
|
|
|
+ else
|
|
|
+ yyerror('Invalid code_page pragma: "' + cp + '"');
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+var
|
|
|
+ yycapture: AnsiString;
|
|
|
+const ILLEGAL = 257;
|
|
|
+const CSTRING = 258;
|
|
|
+const NUMBER = 259;
|
|
|
+const ID = 260;
|
|
|
+const EQUAL = 261;
|
|
|
+const R_AND = 262;
|
|
|
+const UNEQUAL = 263;
|
|
|
+const GT = 264;
|
|
|
+const LT = 265;
|
|
|
+const GTE = 266;
|
|
|
+const LTE = 267;
|
|
|
+const QUESTIONMARK = 268;
|
|
|
+const COLON = 269;
|
|
|
+
|
|
|
+var yylval : YYSType;
|
|
|
+
|
|
|
+function yylex : Integer; forward;
|
|
|
+
|
|
|
+function yyparse : Integer;
|
|
|
+
|
|
|
+var yystate, yysp, yyn : Integer;
|
|
|
+ yys : array [1..yymaxdepth] of Integer;
|
|
|
+ yyv : array [1..yymaxdepth] of YYSType;
|
|
|
+ yyval : YYSType;
|
|
|
+
|
|
|
+procedure yyaction ( yyruleno : Integer );
|
|
|
+ (* local definitions: *)
|
|
|
+begin
|
|
|
+ (* actions: *)
|
|
|
+ case yyruleno of
|
|
|
+ 1 : begin
|
|
|
+ Echo;
|
|
|
+ end;
|
|
|
+ 2 : begin
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+end(*yyaction*);
|
|
|
+
|
|
|
+(* parse table: *)
|
|
|
+
|
|
|
+type YYARec = record
|
|
|
+ sym, act : Integer;
|
|
|
+ end;
|
|
|
+ YYRRec = record
|
|
|
+ len, sym : Integer;
|
|
|
+ end;
|
|
|
+
|
|
|
+const
|
|
|
+
|
|
|
+yynacts = 2;
|
|
|
+yyngotos = 1;
|
|
|
+yynstates = 3;
|
|
|
+yynrules = 2;
|
|
|
+
|
|
|
+yya : array [1..yynacts] of YYARec = (
|
|
|
+{ 0: }
|
|
|
+{ 1: }
|
|
|
+ ( sym: 0; act: 0 ),
|
|
|
+ ( sym: 260; act: 2 )
|
|
|
+{ 2: }
|
|
|
+);
|
|
|
+
|
|
|
+yyg : array [1..yyngotos] of YYARec = (
|
|
|
+{ 0: }
|
|
|
+ ( sym: -2; act: 1 )
|
|
|
+{ 1: }
|
|
|
+{ 2: }
|
|
|
+);
|
|
|
+
|
|
|
+yyd : array [0..yynstates-1] of Integer = (
|
|
|
+{ 0: } -2,
|
|
|
+{ 1: } 0,
|
|
|
+{ 2: } -1
|
|
|
+);
|
|
|
+
|
|
|
+yyal : array [0..yynstates-1] of Integer = (
|
|
|
+{ 0: } 1,
|
|
|
+{ 1: } 1,
|
|
|
+{ 2: } 3
|
|
|
+);
|
|
|
+
|
|
|
+yyah : array [0..yynstates-1] of Integer = (
|
|
|
+{ 0: } 0,
|
|
|
+{ 1: } 2,
|
|
|
+{ 2: } 2
|
|
|
+);
|
|
|
+
|
|
|
+yygl : array [0..yynstates-1] of Integer = (
|
|
|
+{ 0: } 1,
|
|
|
+{ 1: } 2,
|
|
|
+{ 2: } 2
|
|
|
+);
|
|
|
+
|
|
|
+yygh : array [0..yynstates-1] of Integer = (
|
|
|
+{ 0: } 1,
|
|
|
+{ 1: } 1,
|
|
|
+{ 2: } 1
|
|
|
+);
|
|
|
+
|
|
|
+yyr : array [1..yynrules] of YYRRec = (
|
|
|
+{ 1: } ( len: 2; sym: -2 ),
|
|
|
+{ 2: } ( len: 0; sym: -2 )
|
|
|
+);
|
|
|
+
|
|
|
+
|
|
|
+const _error = 256; (* error token *)
|
|
|
+
|
|
|
+function yyact(state, sym : Integer; var act : Integer) : Boolean;
|
|
|
+ (* search action table *)
|
|
|
+ var k : Integer;
|
|
|
+ begin
|
|
|
+ k := yyal[state];
|
|
|
+ while (k<=yyah[state]) and (yya[k].sym<>sym) do inc(k);
|
|
|
+ if k>yyah[state] then
|
|
|
+ yyact := false
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ act := yya[k].act;
|
|
|
+ yyact := true;
|
|
|
+ end;
|
|
|
+ end(*yyact*);
|
|
|
+
|
|
|
+function yygoto(state, sym : Integer; var nstate : Integer) : Boolean;
|
|
|
+ (* search goto table *)
|
|
|
+ var k : Integer;
|
|
|
+ begin
|
|
|
+ k := yygl[state];
|
|
|
+ while (k<=yygh[state]) and (yyg[k].sym<>sym) do inc(k);
|
|
|
+ if k>yygh[state] then
|
|
|
+ yygoto := false
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ nstate := yyg[k].act;
|
|
|
+ yygoto := true;
|
|
|
+ end;
|
|
|
+ end(*yygoto*);
|
|
|
+
|
|
|
+label parse, next, error, errlab, shift, reduce, accept, abort;
|
|
|
+
|
|
|
+begin(*yyparse*)
|
|
|
+
|
|
|
+ (* initialize: *)
|
|
|
+
|
|
|
+ yystate := 0; yychar := -1; yynerrs := 0; yyerrflag := 0; yysp := 0;
|
|
|
+
|
|
|
+{$ifdef yydebug}
|
|
|
+ yydebug := true;
|
|
|
+{$else}
|
|
|
+ yydebug := false;
|
|
|
+{$endif}
|
|
|
+
|
|
|
+parse:
|
|
|
+
|
|
|
+ (* push state and value: *)
|
|
|
+
|
|
|
+ inc(yysp);
|
|
|
+ if yysp>yymaxdepth then
|
|
|
+ begin
|
|
|
+ yyerror('yyparse stack overflow');
|
|
|
+ goto abort;
|
|
|
+ end;
|
|
|
+ yys[yysp] := yystate; yyv[yysp] := yyval;
|
|
|
+
|
|
|
+next:
|
|
|
+
|
|
|
+ if (yyd[yystate]=0) and (yychar=-1) then
|
|
|
+ (* get next symbol *)
|
|
|
+ begin
|
|
|
+ yychar := yylex; if yychar<0 then yychar := 0;
|
|
|
+ end;
|
|
|
+
|
|
|
+ if yydebug then writeln('state ', yystate, ', char ', yychar);
|
|
|
+
|
|
|
+ (* determine parse action: *)
|
|
|
+
|
|
|
+ yyn := yyd[yystate];
|
|
|
+ if yyn<>0 then goto reduce; (* simple state *)
|
|
|
+
|
|
|
+ (* no default action; search parse table *)
|
|
|
+
|
|
|
+ if not yyact(yystate, yychar, yyn) then goto error
|
|
|
+ else if yyn>0 then goto shift
|
|
|
+ else if yyn<0 then goto reduce
|
|
|
+ else goto accept;
|
|
|
+
|
|
|
+error:
|
|
|
+
|
|
|
+ (* error; start error recovery: *)
|
|
|
+
|
|
|
+ if yyerrflag=0 then yyerror('syntax error');
|
|
|
+
|
|
|
+errlab:
|
|
|
+
|
|
|
+ if yyerrflag=0 then inc(yynerrs); (* new error *)
|
|
|
+
|
|
|
+ if yyerrflag<=2 then (* incomplete recovery; try again *)
|
|
|
+ begin
|
|
|
+ yyerrflag := 3;
|
|
|
+ (* uncover a state with shift action on error token *)
|
|
|
+ while (yysp>0) and not ( yyact(yys[yysp], _error, yyn) and
|
|
|
+ (yyn>0) ) do
|
|
|
+ begin
|
|
|
+ if yydebug then
|
|
|
+ if yysp>1 then
|
|
|
+ writeln('error recovery pops state ', yys[yysp], ', uncovers ',
|
|
|
+ yys[yysp-1])
|
|
|
+ else
|
|
|
+ writeln('error recovery fails ... abort');
|
|
|
+ dec(yysp);
|
|
|
+ end;
|
|
|
+ if yysp=0 then goto abort; (* parser has fallen from stack; abort *)
|
|
|
+ yystate := yyn; (* simulate shift on error *)
|
|
|
+ goto parse;
|
|
|
+ end
|
|
|
+ else (* no shift yet; discard symbol *)
|
|
|
+ begin
|
|
|
+ if yydebug then writeln('error recovery discards char ', yychar);
|
|
|
+ if yychar=0 then goto abort; (* end of input; abort *)
|
|
|
+ yychar := -1; goto next; (* clear lookahead char and try again *)
|
|
|
+ end;
|
|
|
+
|
|
|
+shift:
|
|
|
+
|
|
|
+ (* go to new state, clear lookahead character: *)
|
|
|
+
|
|
|
+ yystate := yyn; yychar := -1; yyval := yylval;
|
|
|
+ if yyerrflag>0 then dec(yyerrflag);
|
|
|
+
|
|
|
+ goto parse;
|
|
|
+
|
|
|
+reduce:
|
|
|
+
|
|
|
+ (* execute action, pop rule from stack, and go to next state: *)
|
|
|
+
|
|
|
+ if yydebug then writeln('reduce ', -yyn);
|
|
|
+
|
|
|
+ yyflag := yyfnone; yyaction(-yyn);
|
|
|
+ dec(yysp, yyr[-yyn].len);
|
|
|
+ if yygoto(yys[yysp], yyr[-yyn].sym, yyn) then yystate := yyn;
|
|
|
+
|
|
|
+ (* handle action calls to yyaccept, yyabort and yyerror: *)
|
|
|
+
|
|
|
+ case yyflag of
|
|
|
+ yyfaccept : goto accept;
|
|
|
+ yyfabort : goto abort;
|
|
|
+ yyferror : goto errlab;
|
|
|
+ end;
|
|
|
+
|
|
|
+ goto parse;
|
|
|
+
|
|
|
+accept:
|
|
|
+
|
|
|
+ yyparse := 0; exit;
|
|
|
+
|
|
|
+abort:
|
|
|
+
|
|
|
+ yyparse := 1; exit;
|
|
|
+
|
|
|
+end(*yyparse*);
|
|
|
+
|
|
|
+
|
|
|
+{$I rclex.inc}
|
|
|
+begin
|
|
|
+ bufptr:= 0;
|
|
|
+ lexlib.get_char:= @rc_get_char;
|
|
|
+ lexlib.unget_char:= @rc_unget_char;
|
|
|
+end.
|