From 9bb8c2f4008eaa435d887480360c116c3bb651d1 Mon Sep 17 00:00:00 2001 From: marco Date: Fri, 8 May 2015 17:01:11 +0000 Subject: [PATCH] --- Merging r29502 into '.': U utils/tply/pyacc.y --- Merging r29503 into '.': U utils/tply/lexbase.pas G utils/tply/pyacc.y U utils/tply/pyacc.pas U utils/tply/plex.pas U utils/tply/yaccbase.pas --- Merging r30289 into '.': U utils/tply/README.txt # revisions: 29502,29503,30289 git-svn-id: branches/fixes_3_0@30825 - --- utils/tply/README.txt | 21 +++-- utils/tply/lexbase.pas | 3 +- utils/tply/plex.pas | 33 +++++--- utils/tply/pyacc.pas | 182 +++++++++++++++++++++------------------- utils/tply/pyacc.y | 52 ++++++------ utils/tply/yaccbase.pas | 3 +- 6 files changed, 162 insertions(+), 132 deletions(-) diff --git a/utils/tply/README.txt b/utils/tply/README.txt index ad74337b6c..8eefacac84 100644 --- a/utils/tply/README.txt +++ b/utils/tply/README.txt @@ -16,7 +16,7 @@ available from the TPLY homepage: For information about the Free Pascal Compiler, please refer to: - http://tfdec1.fys.kuleuven.ac.be/~michael/fpc/fpc.html + http://www.freepascal.org/ The manual can be found in the files tply.tex (TeX version) and tply.doc (ASCII version) contained in the package. An extended version of the manual @@ -44,7 +44,7 @@ The original version of the TPLY package was written by Albert Graef 4.0-6.0. Berend de Boer , the current maintainer of the Turbo/Borland Pascal version, adapted TPLY to take advantage of the large memory models in Borland Pascal 7.0 and Delphi. Michael Van Canneyt -, who maintains the Linux version of +, who maintains the Linux version of the Free Pascal compiler, is the author of the Free Pascal port. @@ -77,10 +77,9 @@ to store things :-) The 16-bit DPMI platforms have tables extended as large as possible without changing basic Lex or Yacc sources. This version was ported to Free Pascal by Michael Van Canneyt - (April 1998). + (April 1998). -*** Version 4.1 Michael Van Canneyt - +*** Version 4.1 Michael Van Canneyt Albert Graef May 1998. Merges the Turbo and Free Pascal versions into a single package. @@ -142,6 +141,18 @@ from the lex.pas and yacc.pas programs), the Lex and Yacc code templates (*.cod files), and the LexLib and YaccLib library units (compiled from lexlib.pas and yacclib.pas). +The plex and pyacc programs will look for the *.cod files in the following locations: +For unix-like operating systems: +1. Current directory. +2. Directory given by FPCDIR +3. Directory /usr/local/lib/fpc/lexyacc +4. Directory /usr/lib/fpc/lexyacc + +For other operating systems (dos/windows-like) : +1. Current directory. +2. Directory given by FPCDIR +3. Directory where the executable is located. + For the Free Pascal/Linux version, a Makefile is provided. To install, issue the command `make' (maybe you have to edit the Makefile before this to reflect your setup) and then `make install'. Note that in the Linux version the diff --git a/utils/tply/lexbase.pas b/utils/tply/lexbase.pas index 12191562f3..f6b329203c 100644 --- a/utils/tply/lexbase.pas +++ b/utils/tply/lexbase.pas @@ -65,7 +65,8 @@ lfilename : String; pasfilename : String; lstfilename : String; codfilename : String; -codfilepath : String; { Under linux, binary and conf file +codfilepath1, +codfilepath2 : String; { Under linux, binary and conf file are not in the same path} (* Lex input, output, list and code template file: *) diff --git a/utils/tply/plex.pas b/utils/tply/plex.pas index 58a61125c1..88939a1db9 100644 --- a/utils/tply/plex.pas +++ b/utils/tply/plex.pas @@ -62,7 +62,7 @@ $History: LEX.PAS $ program Lex; uses - LexBase, LexTable, LexPos, LexDFA, LexOpt, LexList, LexRules, LexMsgs; + LexBase, LexTable, LexPos, LexDFA, LexOpt, LexList, LexRules, LexMsgs, SysUtils; procedure get_line; @@ -597,15 +597,14 @@ var i : Integer; begin {$ifdef Unix} - {$ifdef BSD} - codfilepath:='/usr/local/lib/fpc/lexyacc/'; - {$else} - codfilepath:='/usr/lib/fpc/lexyacc/'; - {$endif} + codfilepath1:='/usr/local/lib/fpc/lexyacc/'; + codfilepath2:='/usr/lib/fpc/lexyacc/'; {$else} - codfilepath:=path(paramstr(0)); + codfilepath1:=path(paramstr(0)); + codfilepath2:=''; {$endif} + (* sign-on: *) writeln(sign_on); @@ -662,17 +661,29 @@ begin rewrite(yyout); if ioresult<>0 then fatal(cannot_open_file+pasfilename); rewrite(yylst); if ioresult<>0 then fatal(cannot_open_file+lstfilename); - (* search code template in current directory, then on path where Lex - was executed from: *) + (* search code template *) codfilename := 'yylex.cod'; assign(yycod, codfilename); reset(yycod); if ioresult<>0 then begin - codfilename := codfilepath+'yylex.cod'; + codfilename := IncludeTrailingPathDelimiter(GetEnvironmentVariable('FPCDIR'))+'lexyacc'+DirectorySeparator+'yylex.cod'; assign(yycod, codfilename); reset(yycod); - if ioresult<>0 then fatal(cannot_open_file+codfilename); + if ioresult<>0 then + begin + codfilename := codfilepath1+'yylex.cod'; + assign(yycod, codfilename); + reset(yycod); + if (codfilepath2<>'') and (ioresult<>0) then + begin + codfilename := codfilepath2+'yylex.cod'; + assign(yycod, codfilename); + reset(yycod); + if ioresult<>0 then + fatal(cannot_open_file+codfilename); + end; + end; end; (* parse source grammar: *) diff --git a/utils/tply/pyacc.pas b/utils/tply/pyacc.pas index 38d118e081..7964476f6e 100644 --- a/utils/tply/pyacc.pas +++ b/utils/tply/pyacc.pas @@ -36,7 +36,7 @@ Last changes: updates) $History: YACC.PAS $ - * + * * ***************** Version 2 ***************** * User: Berend Date: 96-10-10 Time: 21:16 * Updated in $/Lex and Yacc/tply @@ -110,7 +110,7 @@ uses YaccChk source not available anymore PM } {$ENDIF} {$ENDIF} - YaccLib, YaccBase, YaccMsgs, YaccSem, YaccTabl, YaccPars; + YaccLib, YaccBase, YaccMsgs, YaccSem, YaccTabl, YaccPars, SysUtils; const ID = 257; const C_ID = 258; @@ -161,28 +161,28 @@ begin yyval := yyv[yysp-0]; end; 6 : begin - yyerrok; + yyerrok; end; 7 : begin - yyerrok; + yyerrok; end; 8 : begin - yyerrok; + yyerrok; end; 9 : begin - yyerrok; + yyerrok; end; 10 : begin - yyerrok; + yyerrok; end; 11 : begin - yyerrok; + yyerrok; end; 12 : begin yyval := yyv[yysp-0]; end; 13 : begin - yyerrok; + yyerrok; end; 14 : begin yyval := yyv[yysp-0]; @@ -191,19 +191,19 @@ begin yyval := yyv[yysp-0]; end; 16 : begin - error(rcurl_expected); + error(rcurl_expected); end; 17 : begin yyval := yyv[yysp-0]; end; 18 : begin - yyerrok; + yyerrok; end; 19 : begin - yyerrok; + yyerrok; end; 20 : begin - yyerrok; + yyerrok; end; 21 : begin yyval := yyv[yysp-0]; @@ -212,7 +212,7 @@ begin yyval := yyv[yysp-0]; end; 23 : begin - error(rbrace_expected); + error(rbrace_expected); end; 24 : begin yyval := yyv[yysp-0]; @@ -221,7 +221,7 @@ begin yyval := yyv[yysp-0]; end; 26 : begin - error(rangle_expected); + error(rangle_expected); end; 27 : begin yyval := yyv[yysp-0]; @@ -229,12 +229,12 @@ begin 28 : begin sort_types; definitions; - next_section; + next_section; end; 29 : begin next_section; generate_parser; - next_section; + next_section; end; 30 : begin yyval := yyv[yysp-5]; @@ -242,48 +242,48 @@ begin 31 : begin end; 32 : begin - copy_rest_of_file; + copy_rest_of_file; end; 33 : begin end; 34 : begin - yyerrok; + yyerrok; end; 35 : begin - error(error_in_def); + error(error_in_def); end; 36 : begin - startnt := ntsym(yyv[yysp-0]); + startnt := ntsym(yyv[yysp-0]); end; 37 : begin - error(ident_expected); + error(ident_expected); end; 38 : begin - copy_code; + copy_code; end; 39 : begin yyval := yyv[yysp-2]; end; 40 : begin - act_prec := 0; + act_prec := 0; end; 41 : begin yyval := yyv[yysp-3]; end; 42 : begin - act_prec := new_prec_level(left); + act_prec := new_prec_level(left); end; 43 : begin yyval := yyv[yysp-3]; end; 44 : begin - act_prec := new_prec_level(right); + act_prec := new_prec_level(right); end; 45 : begin yyval := yyv[yysp-3]; end; 46 : begin - act_prec := new_prec_level(nonassoc); + act_prec := new_prec_level(nonassoc); end; 47 : begin yyval := yyv[yysp-3]; @@ -295,169 +295,169 @@ begin yyval := yyv[yysp-1]; end; 50 : begin - act_type := 0; + act_type := 0; end; 51 : begin - act_type := yyv[yysp-1]; add_type(yyv[yysp-1]); + act_type := yyv[yysp-1]; add_type(yyv[yysp-1]); end; 52 : begin yyval := yyv[yysp-0]; end; 53 : begin - yyerrok; + yyerrok; end; 54 : begin - yyerrok; + yyerrok; end; 55 : begin - error(ident_expected); + error(ident_expected); end; 56 : begin - error(error_in_def); + error(error_in_def); end; 57 : begin - error(ident_expected); + error(ident_expected); end; 58 : begin if act_type<>0 then sym_type^[yyv[yysp-0]] := act_type; if act_prec<>0 then - sym_prec^[yyv[yysp-0]] := act_prec; + sym_prec^[yyv[yysp-0]] := act_prec; end; 59 : begin litsym(yyv[yysp-0], 0); if act_type<>0 then sym_type^[litsym(yyv[yysp-0], 0)] := act_type; if act_prec<>0 then - sym_prec^[litsym(yyv[yysp-0], 0)] := act_prec; + sym_prec^[litsym(yyv[yysp-0], 0)] := act_prec; end; 60 : begin litsym(yyv[yysp-0], 0); if act_type<>0 then sym_type^[litsym(yyv[yysp-0], 0)] := act_type; if act_prec<>0 then - sym_prec^[litsym(yyv[yysp-0], 0)] := act_prec; + sym_prec^[litsym(yyv[yysp-0], 0)] := act_prec; end; 61 : begin litsym(yyv[yysp-1], 0); if act_type<>0 then sym_type^[litsym(yyv[yysp-1], yyv[yysp-0])] := act_type; if act_prec<>0 then - sym_prec^[litsym(yyv[yysp-1], 0)] := act_prec; + sym_prec^[litsym(yyv[yysp-1], 0)] := act_prec; end; 62 : begin litsym(yyv[yysp-1], 0); if act_type<>0 then sym_type^[litsym(yyv[yysp-1], yyv[yysp-0])] := act_type; if act_prec<>0 then - sym_prec^[litsym(yyv[yysp-1], 0)] := act_prec; + sym_prec^[litsym(yyv[yysp-1], 0)] := act_prec; end; 63 : begin yyval := yyv[yysp-0]; end; 64 : begin - yyerrok; + yyerrok; end; 65 : begin - yyerrok; + yyerrok; end; 66 : begin - error(ident_expected); + error(ident_expected); end; 67 : begin - error(error_in_def); + error(error_in_def); end; 68 : begin - error(ident_expected); + error(ident_expected); end; 69 : begin if act_type<>0 then - sym_type^[ntsym(yyv[yysp-0])] := act_type; + sym_type^[ntsym(yyv[yysp-0])] := act_type; end; 70 : begin - next_section; + next_section; end; 71 : begin yyval := yyv[yysp-1]; end; 72 : begin - copy_code; + copy_code; end; 73 : begin - next_section; + next_section; end; 74 : begin yyval := yyv[yysp-4]; end; 75 : begin - yyerrok; + yyerrok; end; 76 : begin - error(error_in_rule); + error(error_in_rule); end; 77 : begin - error(error_in_rule); + error(error_in_rule); end; 78 : begin - start_rule(ntsym(yyv[yysp-0])); + start_rule(ntsym(yyv[yysp-0])); end; 79 : begin - start_body; + start_body; end; 80 : begin - end_body; + end_body; end; 81 : begin yyval := yyv[yysp-0]; end; 82 : begin - start_body; + start_body; end; 83 : begin - end_body; + end_body; end; 84 : begin end; 85 : begin - add_symbol(yyv[yysp-0]); yyerrok; + add_symbol(yyv[yysp-0]); yyerrok; end; 86 : begin - add_symbol(sym(yyv[yysp-0])); yyerrok; + add_symbol(sym(yyv[yysp-0])); yyerrok; end; 87 : begin - add_symbol(sym(yyv[yysp-0])); yyerrok; + add_symbol(sym(yyv[yysp-0])); yyerrok; end; 88 : begin - add_action; yyerrok; + add_action; yyerrok; end; 89 : begin - error(error_in_rule); + error(error_in_rule); end; 90 : begin - copy_action; + copy_action; end; 91 : begin yyval := yyv[yysp-2]; end; 92 : begin - copy_single_action; + copy_single_action; end; 93 : begin end; 94 : begin - add_rule_prec(yyv[yysp-0]); + add_rule_prec(yyv[yysp-0]); end; 95 : begin yyval := yyv[yysp-3]; end; 96 : begin - add_rule_prec(litsym(yyv[yysp-0], 0)); + add_rule_prec(litsym(yyv[yysp-0], 0)); end; 97 : begin yyval := yyv[yysp-3]; end; 98 : begin - add_rule_prec(litsym(yyv[yysp-0], 0)); + add_rule_prec(litsym(yyv[yysp-0], 0)); end; 99 : begin yyval := yyv[yysp-3]; @@ -468,7 +468,7 @@ begin 101 : begin end; 102 : begin - add_action; + add_action; end; end; end(*yyaction*); @@ -2131,10 +2131,10 @@ function yylex : integer; ('0'<=line[cno]) and (line[cno]<='9') or (line[cno]='_') or (line[cno]='.') ) do - begin - idstr := idstr+line[cno]; - inc(cno) - end; + begin + idstr := idstr+line[cno]; + inc(cno) + end; yylval := get_key(idstr); scan; if not end_of_input and (line[cno]=':') then @@ -2352,9 +2352,9 @@ function yylex : integer; else case line[cno] of 'A'..'Z', 'a'..'z', '_' : yylex := scan_ident; - '''', '"' : yylex := scan_literal; - '0'..'9' : yylex := scan_num; - '%', '\' : yylex := scan_keyword; + '''', '"' : yylex := scan_literal; + '0'..'9' : yylex := scan_num; + '%', '\' : yylex := scan_keyword; '=' : if (cno0 then fatal(cannot_open_file+pasfilename); rewrite(yylst); if ioresult<>0 then fatal(cannot_open_file+lstfilename); - (* search code template in current directory, then on path where Yacc - was executed from: *) + (* search code template *) codfilename := 'yyparse.cod'; assign(yycod, codfilename); reset(yycod); if ioresult<>0 then begin - codfilename := codfilepath+'yyparse.cod'; + codfilename := IncludeTrailingPathDelimiter(GetEnvironmentVariable('FPCDIR'))+'lexyacc'+DirectorySeparator+'yyparse.cod'; assign(yycod, codfilename); reset(yycod); - if ioresult<>0 then fatal(cannot_open_file+codfilename); + if ioresult<>0 then + begin + codfilename := codfilepath1+'yyparse.cod'; + assign(yycod, codfilename); + reset(yycod); + if (codfilepath2<>'') and (ioresult<>0) then + begin + codfilename := codfilepath2+'yyparse.cod'; + assign(yycod, codfilename); + reset(yycod); + if ioresult<>0 then + fatal(cannot_open_file+codfilename); + end; + end; end; (* parse source grammar: *) @@ -2513,4 +2523,4 @@ begin halt(errors); -end(*Yacc*). +end(*Yacc*). \ No newline at end of file diff --git a/utils/tply/pyacc.y b/utils/tply/pyacc.y index ff36d4f099..ddf614e1ce 100644 --- a/utils/tply/pyacc.y +++ b/utils/tply/pyacc.y @@ -55,7 +55,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -$Revision: 1.3 $ +$Revision: 1.5 $ $Modtime: 96-08-01 11:24 $ @@ -129,16 +129,6 @@ $History: YACC.PAS $ *) -{$IFDEF MsDos} -{$M 16384,0,655360} -{$ENDIF} -{$IFDEF DPMI} -{$M 32768} -{$ENDIF} -{$IFDEF Windows} -{$M 32768,0} -{$ENDIF} - {$X+} {$I-} program Yacc; @@ -146,15 +136,11 @@ program Yacc; uses {$IFDEF Debug} {$IFDEF DPMI} - YaccChk, + { YaccChk, removed as obsolete, + YaccChk source not available anymore PM } {$ENDIF} {$ENDIF} -{$IFDEF Windows} -{$IFNDEF Console} - WinCrt, -{$ENDIF} -{$ENDIF} - YaccLib, YaccBase, YaccMsgs, YaccSem, YaccTabl, YaccPars; + YaccLib, YaccBase, YaccMsgs, YaccSem, YaccTabl, YaccPars, SysUtils; %} @@ -725,13 +711,11 @@ var i : Integer; begin {$ifdef Unix} - {$ifdef BSD} - codfilepath:='/usr/local/lib/fpc/lexyacc/'; - {$else} - codfilepath:='/usr/lib/fpc/lexyacc/'; - {$endif} + codfilepath1:='/usr/local/lib/fpc/lexyacc/'; + codfilepath2:='/usr/lib/fpc/lexyacc/'; {$else} - codfilepath:=path(paramstr(0)); + codfilepath1:=path(paramstr(0)); + codfilepath2:=''; {$endif} (* sign-on: *) @@ -790,17 +774,29 @@ begin rewrite(yyout); if ioresult<>0 then fatal(cannot_open_file+pasfilename); rewrite(yylst); if ioresult<>0 then fatal(cannot_open_file+lstfilename); - (* search code template in current directory, then on path where Yacc - was executed from: *) + (* search code template *) codfilename := 'yyparse.cod'; assign(yycod, codfilename); reset(yycod); if ioresult<>0 then begin - codfilename := codfilepath+'yyparse.cod'; + codfilename := IncludeTrailingPathDelimiter(GetEnvironmentVariable('FPCDIR'))+'lexyacc'+DirectorySeparator+'yyparse.cod'; assign(yycod, codfilename); reset(yycod); - if ioresult<>0 then fatal(cannot_open_file+codfilename); + if ioresult<>0 then + begin + codfilename := codfilepath1+'yyparse.cod'; + assign(yycod, codfilename); + reset(yycod); + if (codfilepath2<>'') and (ioresult<>0) then + begin + codfilename := codfilepath2+'yyparse.cod'; + assign(yycod, codfilename); + reset(yycod); + if ioresult<>0 then + fatal(cannot_open_file+codfilename); + end; + end; end; (* parse source grammar: *) diff --git a/utils/tply/yaccbase.pas b/utils/tply/yaccbase.pas index 7608bc3612..0f821ebf01 100644 --- a/utils/tply/yaccbase.pas +++ b/utils/tply/yaccbase.pas @@ -66,7 +66,8 @@ yfilename : String; pasfilename : String; lstfilename : String; codfilename : String; -codfilepath : String; { Under Linux, +codfilepath1, +codfilepath2 : String; { Under Linux, binary and conf file are never in 1 directory.} (* Yacc input, output, list and code template file: *)