mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 16:59:45 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			185 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
 | 
						|
(* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)
 | 
						|
 | 
						|
(* global definitions: *)
 | 
						|
%%
 | 
						|
 | 
						|
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
 | 
						|
%%
 | 
						|
  end;
 | 
						|
end(*yyaction*);
 | 
						|
 | 
						|
(* parse table: *)
 | 
						|
%%
 | 
						|
 | 
						|
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*);
 |