⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sentenceyacc.dpr

📁 语法分析 语法分析
💻 DPR
字号:

(* Yacc parser template (TP Yacc V3.0), V1.2 6-17-91 AG *)

(* global definitions: *)

{*
 * 识别简单英语句子的yacc程序
   编译:yacc sentence sentenceyacc.dpr
 *}
program SentenceYacc;

{$APPTYPE CONSOLE}

uses
  SysUtils, LexLib, YaccLib, Sentence;

const
  Noun = 257;
const
  Pron = 258;
const
  Verb = 259;
const
  Adv = 260;
const
  Adj = 261;
const
  Prep = 262;
const
  Conj = 263;

var
  yylval: YYSType;

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
          writeln('句子有效');
            //注意在yacc中的附加的代码必须加花括号, lex中可以不加
        end;
      2:
        begin
          yyval := yyv[yysp - 0];
        end;
      3:
        begin
          yyval := yyv[yysp - 0];
        end;
      4:
        begin
          yyval := yyv[yysp - 0];
        end;
    end;
  end (*yyaction*);

  (* parse table: *)

type
  YYARec = record
    sym, act: Integer;
  end;
  YYRRec = record
    len, sym: Integer;
  end;

const

  yynacts = 5;
  yyngotos = 3;
  yynstates = 8;
  yynrules = 4;

  yya: array[1..yynacts] of YYARec = (
    { 0: }
    (sym: 257; act: 3),
    (sym: 258; act: 4),
    { 1: }
    (sym: 259; act: 5),
    { 2: }
    (sym: 0; act: 0),
    { 3: }
    { 4: }
    { 5: }
    (sym: 257; act: 7)
    { 6: }
    { 7: }
    );

  yyg: array[1..yyngotos] of YYARec = (
    { 0: }
    (sym: - 3; act: 1),
    (sym: - 2; act: 2),
    { 1: }
    { 2: }
    { 3: }
    { 4: }
    { 5: }
    (sym: - 4; act: 6)
    { 6: }
    { 7: }
    );

  yyd: array[0..yynstates - 1] of Integer = (
    { 0: } 0,
    { 1: } 0,
    { 2: } 0,
    { 3: }-2,
    { 4: }-3,
    { 5: } 0,
    { 6: }-1,
    { 7: }-4
    );

  yyal: array[0..yynstates - 1] of Integer = (
    { 0: } 1,
    { 1: } 3,
    { 2: } 4,
    { 3: } 5,
    { 4: } 5,
    { 5: } 5,
    { 6: } 6,
    { 7: } 6
    );

  yyah: array[0..yynstates - 1] of Integer = (
    { 0: } 2,
    { 1: } 3,
    { 2: } 4,
    { 3: } 4,
    { 4: } 4,
    { 5: } 5,
    { 6: } 5,
    { 7: } 5
    );

  yygl: array[0..yynstates - 1] of Integer = (
    { 0: } 1,
    { 1: } 3,
    { 2: } 3,
    { 3: } 3,
    { 4: } 3,
    { 5: } 3,
    { 6: } 4,
    { 7: } 4
    );

  yygh: array[0..yynstates - 1] of Integer = (
    { 0: } 2,
    { 1: } 2,
    { 2: } 2,
    { 3: } 2,
    { 4: } 2,
    { 5: } 3,
    { 6: } 3,
    { 7: } 3
    );

  yyr: array[1..yynrules] of YYRRec = (
    { 1: }(len: 3; sym: - 2),
    { 2: }(len: 1; sym: - 3),
    { 3: }(len: 1; sym: - 3),
    { 4: }(len: 1; sym: - 4)
    );

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*);

begin
  if yyparse = 0 then { 结束 }
    ;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -