home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549a.lha / M2P_v1.0 / mods.lzh / Parser.mod < prev    next >
Text File  |  1991-08-10  |  16KB  |  721 lines

  1. (*======================================================================*)
  2. (*                      Modula-2 Preprocessor Parser                    *)
  3. (*======================================================================*)
  4. (*  Version:  1.00              Author:   Dennis Brueni                 *)
  5. (*  Date:     07-10-91          Changes:  Original                      *)
  6. (*======================================================================*)
  7.  
  8. IMPLEMENTATION MODULE Parser;
  9.  
  10. IMPORT
  11.     FIO,Strings,Env;
  12. IMPORT
  13.     SymTab,SymLists,MacLists;
  14. IMPORT
  15.     Err,FSM,LexAn;
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69. (*----------------------------------------------------------------------*)
  70.  
  71.  
  72. PROCEDURE SkipSpace;
  73. BEGIN
  74.     WITH FSM.Token DO
  75.         WHILE (Class = FSM.M2ch) AND (String[0] = ' ') DO
  76.             LexAn.GetToken;
  77.         END;
  78.     END;
  79. END SkipSpace;
  80.  
  81. PROCEDURE GetTokenThenSkipSpace;
  82. BEGIN
  83.     LexAn.GetToken;
  84.     SkipSpace;
  85. END GetTokenThenSkipSpace;
  86.  
  87. (*----------------------------------------------------------------------*)
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95. (*----------------------------------------------------------------------*)
  96. (*      Factor  -->     ( Expr ) | NOT ID | ID                          *)
  97. (*----------------------------------------------------------------------*)
  98.  
  99.  
  100. PROCEDURE Factor():BOOLEAN;
  101. VAR
  102.     temp: BOOLEAN;
  103.     symb: SymTab.SymRecPtr;
  104. BEGIN
  105.  
  106.     WITH FSM.Token DO
  107.         CASE Class OF
  108.         FSM.M2LParen:
  109.             GetTokenThenSkipSpace;
  110.             temp:=Expr();
  111.             IF Class # FSM.M2RParen THEN
  112.                 Err.Message(Err.UnBalParens);
  113.             ELSE
  114.                 GetTokenThenSkipSpace;
  115.             END;
  116.         |FSM.M2NOT:
  117.             GetTokenThenSkipSpace;
  118.             temp:=NOT Factor();
  119.         |FSM.M2ID:
  120.             symb:=SymTab.LookUp(String);
  121.             temp:=symb#NIL;
  122.             GetTokenThenSkipSpace;
  123.         ELSE
  124.             Err.Message(Err.IllFactor);
  125.             temp:=TRUE;
  126.         END;
  127.     END;
  128.  
  129.     RETURN temp;
  130. END Factor;
  131.  
  132. (*----------------------------------------------------------------------*)
  133. (*      Term2   -->     & <Factor> <Term2> | e                          *)
  134. (*----------------------------------------------------------------------*)
  135.  
  136. PROCEDURE Term2():BOOLEAN;
  137. VAR
  138.     temp: BOOLEAN;
  139. BEGIN
  140.  
  141.     WITH FSM.Token DO
  142.         IF Class=FSM.M2AND THEN
  143.             GetTokenThenSkipSpace;
  144.             temp:= Factor();
  145.             temp:= Term2() AND temp;
  146.         ELSE
  147.             temp:= TRUE;
  148.         END;
  149.     END;
  150.  
  151.     RETURN temp;
  152. END Term2;
  153.  
  154. (*----------------------------------------------------------------------*)
  155. (*      Term    -->     <Factor> <Term2>                                *)
  156. (*----------------------------------------------------------------------*)
  157.  
  158. PROCEDURE Term():BOOLEAN;
  159. VAR
  160.     temp: BOOLEAN;
  161. BEGIN
  162.  
  163.     temp:= Factor();
  164.     temp:= Term2() AND temp;
  165.  
  166.     RETURN temp;
  167. END Term;
  168.  
  169. (*----------------------------------------------------------------------*)
  170. (*      Expr2   -->     | <Term> <Expr2> | e                            *)
  171. (*----------------------------------------------------------------------*)
  172.  
  173. PROCEDURE Expr2():BOOLEAN;
  174. VAR
  175.     temp: BOOLEAN;
  176. BEGIN
  177.  
  178.     WITH FSM.Token DO
  179.         IF Class=FSM.M2OR THEN
  180.             GetTokenThenSkipSpace;
  181.             temp:= Term();  (* avoid short circuit *)
  182.             temp:= Expr2() OR temp;
  183.         ELSE
  184.             temp:= FALSE;
  185.         END;
  186.     END;
  187.  
  188.     RETURN temp;
  189. END Expr2;
  190.  
  191. (*----------------------------------------------------------------------*)
  192. (*      Expr    -->     <Term> <Expr2>                                  *)
  193. (*----------------------------------------------------------------------*)
  194.  
  195. PROCEDURE Expr():BOOLEAN;
  196. VAR
  197.     temp: BOOLEAN;
  198. BEGIN
  199.  
  200.     temp:=Term();
  201.     temp:=Expr2() OR temp;
  202.  
  203.     RETURN temp;
  204. END Expr;
  205.  
  206. (*----------------------------------------------------------------------*)
  207. (*      PPStmt  -->     IF <Expr> @THEN <S> { @ELSIF <S> }              *)
  208. (*                      [@ELSE <S>] @END                                *)
  209. (*----------------------------------------------------------------------*)
  210.  
  211.  
  212. PROCEDURE IfStmt(Echo: BOOLEAN);
  213.  
  214. VAR
  215.     TrueFalse: BOOLEAN;
  216. BEGIN
  217.  
  218.     TrueFalse:=Expr();
  219.     WITH FSM.Token DO
  220.         IF Class = FSM.M2AtSign THEN
  221.             GetTokenThenSkipSpace;
  222.         END;
  223.         IF Class = FSM.M2THEN THEN
  224.             LexAn.GetToken;
  225.         ELSE
  226.             Err.Message(Err.MissThen);
  227.         END;
  228.         LOOP
  229.             Stmt(Echo AND TrueFalse);
  230.                     (* THEN clause          *)
  231.             IF Class # FSM.M2AtSign THEN
  232.                 Err.Message(Err.MissAtElse);
  233.                 EXIT;
  234.             END;
  235.             GetTokenThenSkipSpace;
  236.  
  237.             IF (Class=FSM.M2ELSIF) THEN
  238.                     (* ELSIF clause, just   *)
  239.                 GetTokenThenSkipSpace;
  240.                     (* like a real IF, sort *)
  241.                 IfStmt(Echo AND NOT TrueFalse);
  242.                     (* of, so have some     *)
  243.                 EXIT;
  244.        (* Tail recursion fun   *)
  245.             END;
  246.  
  247.             IF Class=FSM.M2ELSE THEN
  248.                     (* ELSE clause, ends    *)
  249.                 LexAn.GetToken;
  250.                     (* entire IF statement  *)
  251.                 LOOP
  252.                     Stmt(NOT TrueFalse AND Echo);
  253.                     IF Class # FSM.M2AtSign THEN
  254.                         Err.Message(Err.MissAtEnd);
  255.  
  256.                         RETURN;
  257.                     END;
  258.                     GetTokenThenSkipSpace;
  259.                     IF Class=FSM.M2END THEN
  260.  
  261.                         RETURN;
  262.                     END;
  263.                     PPStmt(NOT TrueFalse AND Echo);
  264.                 END;
  265.             END;
  266.  
  267.             IF Class=FSM.M2END THEN
  268.                 EXIT;
  269.             END;            (* Found the @END?      *)
  270.             PPStmt(Echo AND TrueFalse);
  271.                     (* NO, preprocessor job *)
  272.         END;
  273.     END;
  274.  
  275. END IfStmt;
  276.  
  277. (*----------------------------------------------------------------------*)
  278. (*      PPStmt  -->     DEFINE ID                                       *)
  279. (*----------------------------------------------------------------------*)
  280.  
  281.  
  282. PROCEDURE DefStmt;
  283.  
  284. VAR
  285.     temp: SymTab.SymRecPtr;
  286.     list: SymLists.SymList;
  287. BEGIN
  288.  
  289.     WITH FSM.Token DO
  290.         IF Class = FSM.M2ID THEN
  291.             temp:=SymTab.LookUp(String);
  292.             IF temp # NIL THEN
  293.                 Err.Message(Err.FlagReDefined);
  294.             END;
  295.             SymLists.Create(list);
  296.             SymTab.Insert(String,FALSE,list,list);
  297.         ELSE
  298.             Err.Message(Err.DefXPctdID);
  299.         END;
  300.     END;
  301.  
  302. END DefStmt;
  303.  
  304. (*----------------------------------------------------------------------*)
  305. (*      PPStmt  -->     UNDEF  ID                                       *)
  306. (*----------------------------------------------------------------------*)
  307.  
  308. PROCEDURE UnDefStmt;
  309.  
  310. VAR
  311.     temp: SymTab.SymRecPtr;
  312.  
  313. BEGIN
  314.  
  315.     WITH FSM.Token DO
  316.         IF Class = FSM.M2ID THEN
  317.             temp:=SymTab.LookUp(String);
  318.             IF temp = NIL THEN
  319.                 Err.Message(Err.FlagUnDefined);
  320.             ELSE
  321.                 SymTab.Delete(String);
  322.             END;
  323.         ELSE
  324.             Err.Message(Err.UnDefXPctdID);
  325.         END;
  326.     END;
  327.  
  328. END UnDefStmt;
  329.  
  330. (*----------------------------------------------------------------------*)
  331. (*      PPStmt  -->     MACRO ID[(ID {,ID} ) ] <S> @END                 *)
  332. (*----------------------------------------------------------------------*)
  333.  
  334. PROCEDURE MacroStmt;
  335.  
  336. VAR
  337.     temp: SymTab.SymRecPtr;
  338.     args: SymLists.SymList;
  339.     list: SymLists.SymList;
  340.     name: Strings.BigString;
  341.     MacNest: CARDINAL;
  342.     atsign: ARRAY [0..1] OF CHAR;
  343.     OldStrip: BOOLEAN;
  344.  
  345. BEGIN
  346.  
  347.     OldStrip:=FSM.StripFlag;
  348.     FSM.StripFlag:=TRUE;
  349.     atsign[0]:='@';
  350.     atsign[1]:=0C;
  351.     MacNest:=0;
  352.     WITH FSM.Token DO
  353.         IF Class = FSM.M2ID THEN
  354.             Strings.Assign(String,name);
  355.             temp:=SymTab.LookUp(String);
  356.             IF temp # NIL THEN
  357.                 Err.Message(Err.FlagReDefined);
  358.             END;
  359.             SymLists.Create(list);
  360.             SymLists.Create(args);
  361.             LexAn.GetToken;
  362.             IF Class = FSM.M2LParen THEN
  363.                     (* argument list *)
  364.                 GetTokenThenSkipSpace;
  365.                 IF Class = FSM.M2ID THEN
  366.                     MacLists.Insert(args,String,Class);
  367.                     GetTokenThenSkipSpace;
  368.                 END;
  369.                 WHILE Class = FSM.M2Comma DO
  370.                     GetTokenThenSkipSpace;
  371.                     IF Class = FSM.M2ID THEN
  372.                         MacLists.Insert(args,String,Class);
  373.                         GetTokenThenSkipSpace;
  374.                     ELSE
  375.                         Err.Message(Err.MissMacArg);
  376.                     END;
  377.                 END;
  378.                 IF Class = FSM.M2RParen THEN
  379.                     GetTokenThenSkipSpace;
  380.                 ELSE
  381.                     Err.Message(Err.MissMacRP);
  382.                 END;
  383.             END;
  384.             LOOP
  385.                 WHILE NOT (Class IN FSM.LexSet{FSM.M2AtSign,FSM.M2EOF}) DO
  386.                     MacLists.Insert(list,String,Class);
  387.                     LexAn.GetToken;
  388.                 END;
  389.                 IF Class=FSM.M2EOF THEN
  390.                     Err.Message(Err.MacNotEnded);
  391.                     EXIT;
  392.                 END;
  393.                 GetTokenThenSkipSpace;
  394.                 CASE Class OF
  395.                 FSM.M2ENDM :
  396.                     IF MacNest=0 THEN
  397.                         EXIT;
  398.                     ELSE
  399.                         DEC(MacNest);
  400.                     END;
  401.                 |FSM.M2MACRO:
  402.                     INC(MacNest);
  403.                 ELSE
  404.                 END;
  405.                 MacLists.Insert(list,atsign,FSM.M2AtSign);
  406.             END;
  407.             SymLists.Reverse(list);
  408.             SymLists.Reverse(args);
  409.             SymTab.Insert(name,TRUE,list,args);
  410.         ELSE
  411.             Err.Message(Err.MacXPctdID);
  412.         END;
  413.     END;
  414.  
  415.     FSM.StripFlag:=OldStrip;
  416. END MacroStmt;
  417.  
  418. (*----------------------------------------------------------------------*)
  419. (*      PPStmt  -->     ID[(<S> {,<S>} ) ]                              *)
  420. (*----------------------------------------------------------------------*)
  421.  
  422. PROCEDURE MacroExpand;
  423.  
  424. VAR
  425.     macro : SymTab.SymRecPtr;
  426.     argnam: MacLists.TokRecPtr;
  427.     parens: CARDINAL;               (* for balancing parens *)
  428.     args,newarg,arglst,null: SymLists.SymList;
  429.     exclam, atsign : ARRAY [0..1] OF CHAR;
  430.  
  431. PROCEDURE AddMacro;
  432. BEGIN
  433.     SymLists.Reverse(newarg);
  434.     IF SymLists.Empty(args) THEN    (* stick it on symtab *)
  435.         Err.Message(Err.TooMany);
  436.     ELSE
  437.         argnam:=SymLists.First(args);
  438.         args:=SymLists.Next(args);
  439.         SymTab.Insert(argnam^.sym^,TRUE,newarg,null);
  440.         SymLists.Insert(arglst,argnam);
  441.         MacLists.Insert(arglst,exclam,FSM.M2KillArg);
  442.     END;
  443. END AddMacro;
  444.  
  445. BEGIN
  446.  
  447.     atsign[0]:='@';
  448.     atsign[1]:=0C;
  449.     exclam[0]:='!';
  450.     exclam[1]:=0C;
  451.     WITH FSM.Token DO
  452.         macro:=SymTab.LookUp(String);
  453.         IF macro = NIL THEN
  454.             Err.Message(Err.FlagUnDefined);
  455.         ELSE
  456.             WITH macro^ DO
  457.                 IF NOT mac THEN
  458.                     Err.Message(Err.IDNotMacro);
  459.                 ELSE
  460.                     LexAn.GetToken;
  461.                     SymLists.Create(arglst);
  462.                     IF Class # FSM.M2LParen THEN
  463.                     (* argument list *)
  464.                         MacLists.Insert(arglst,String,Class);
  465.                     ELSE
  466.                         args:=mca;
  467.                         SymLists.Create(null);
  468.                     (* empty param list for args *)
  469.                         LOOP
  470.                             LexAn.GetToken;
  471.                             SymLists.Create(newarg);
  472.                     (* get an argument *)
  473.                             parens:=0;
  474.                             WHILE Class # FSM.M2Comma DO
  475.                                 CASE Class OF
  476.                                 FSM.M2AtSign:
  477.                                     GetTokenThenSkipSpace;
  478.                                     IF NOT (Class IN FSM.LexSet{FSM.M2Comma, FSM.M2RParen,
  479.                                     FSM.M2LParen}) THEN
  480.                                         MacLists.Insert(newarg,atsign,FSM.M2AtSign);
  481.                                     END;
  482.                                 |FSM.M2LParen:
  483.                                     INC(parens);
  484.                                 |FSM.M2RParen:
  485.                                     IF parens > 0 THEN
  486.                                         DEC(parens);
  487.                                     ELSE
  488.                                         EXIT;
  489.                                     END;
  490.                                 |FSM.M2EOF:
  491.                                     Err.Message(Err.ArgNotEnded);
  492.                                     EXIT;
  493.                                 ELSE
  494.                                 END;
  495.                                 MacLists.Insert(newarg,String,Class);
  496.                                 LexAn.GetToken;
  497.                             END;
  498.                             AddMacro;
  499.                         END;
  500.                         AddMacro;
  501.                     END;
  502.       (* loop *)
  503.                     LexAn.FeedMacro(arglst);
  504.                     (* reminder TO remove bindings *)
  505.                     LexAn.FeedMacro(mcl);
  506.                 END;
  507.       (* IF *)
  508.             END;
  509.       (* WITH macro^ *)
  510.         END;
  511.       (* IF *)
  512.     END;
  513.       (* WITH FSM.Token *)
  514.  
  515. END MacroExpand;
  516.  
  517. (*----------------------------------------------------------------------*)
  518. (*      PPStmt  -->     INCLUDE String | INCLUDE Str                    *)
  519. (*----------------------------------------------------------------------*)
  520.  
  521.  
  522. PROCEDURE IncStmt;
  523.  
  524. VAR
  525.     oldsrc: FIO.FILE;
  526.     list: SymLists.SymList;
  527.     LPtr: MacLists.TokRecPtr;
  528.     FPath: Strings.BigString;
  529.  
  530. BEGIN
  531.  
  532.     oldsrc:=FSM.SourceFile;
  533.     INC(FSM.IncludeLevel);
  534.     list:=IncludeList;
  535.     WITH FSM.Token DO
  536.         IF Class IN FSM.LexSet{FSM.M2Str,FSM.M2String} THEN
  537.             LOOP
  538.                 IF SymLists.Empty(list) THEN
  539.                     FIO.WriteString(FIO.OUTPUT,'Could not find include file:  ');
  540.                     FIO.WriteString(FIO.OUTPUT,String);
  541.                     FIO.WriteLn(FIO.OUTPUT);
  542.                     EXIT;
  543.                 END;
  544.                 LPtr:=SymLists.First(list);
  545.                 Strings.Assign(LPtr^.sym^,FPath);
  546.                 Strings.Append(String,FPath);
  547.                 IF LexAn.SetSourceFile(FPath) THEN
  548.                     Parse;
  549.                     FIO.Close(FSM.SourceFile);
  550.                     EXIT;
  551.                 END;
  552.                 list:=SymLists.Next(list);
  553.             END;
  554.         ELSE
  555.             Err.Message(Err.MissStr);
  556.         END;
  557.     END;
  558.     DEC(FSM.IncludeLevel);
  559.     FSM.SourceFile:=oldsrc;
  560.  
  561. END IncStmt;
  562.  
  563. (*----------------------------------------------------------------------*)
  564. (*      PPStmt  -->     IF <Expr> @THEN <S> { @ELSIF <S> }              *)
  565. (*                      [@ELSE <S>] @END                                *)
  566. (*      PPStmt  -->     DEFINE ID | UNDEF  ID                           *)
  567. (*      PPStmt  -->     INCLUDE String | INCLUDE Str                    *)
  568. (*      PPStmt  -->     MACRO ID[(ID {,ID} ) ] <S> @END                 *)
  569. (*      PPStmt  -->     ID[(<S> {,<S>} ) ]                              *)
  570. (*      PPStmt  -->     LINE | SPACE | STRIP | NOSTRIP                  *)
  571. (*      PPStmt  -->     ',' | '@' | '(' | ')'                           *)
  572. (*----------------------------------------------------------------------*)
  573.  
  574.  
  575. PROCEDURE PPStmt(Echo: BOOLEAN);
  576. BEGIN
  577.  
  578.     WITH FSM.Token DO
  579.         IF Echo THEN
  580.             CASE Class OF
  581.             FSM.M2IF :
  582.                 GetTokenThenSkipSpace;
  583.                 IfStmt(Echo);
  584.             |FSM.M2DEFINE :
  585.                 GetTokenThenSkipSpace;
  586.                 DefStmt;
  587.             |FSM.M2UNDEF :
  588.                 GetTokenThenSkipSpace;
  589.                 UnDefStmt;
  590.             |FSM.M2INCLUDE:
  591.                 GetTokenThenSkipSpace;
  592.                 IncStmt;
  593.             |FSM.M2MACRO :
  594.                 GetTokenThenSkipSpace;
  595.                 MacroStmt;
  596.             |FSM.M2ID :
  597.                 MacroExpand;
  598.             |FSM.M2STRIP :
  599.                 FSM.StripFlag:=TRUE;
  600.             |FSM.M2NOSTRIP:
  601.                 FSM.StripFlag:=FALSE;
  602.             |FSM.M2LINE :
  603.                 FIO.WriteLn(FSM.DestFile);
  604.             |FSM.M2SPACE :
  605.                 FIO.WriteChar(FSM.DestFile,' ');
  606.             |FSM.M2Comma, FSM.M2AtSign, FSM.M2LParen, FSM.M2RParen :
  607.                 FIO.WriteChar(FSM.DestFile,String[0]);
  608.             ELSE
  609.                 Err.Message(Err.BadPPStmt);
  610.                 FIO.WriteString(FSM.DestFile,String);
  611.             END;
  612.         ELSE
  613.             IF Class=FSM.M2IF THEN
  614.                     (* have to parse IF's   *)
  615.                 GetTokenThenSkipSpace;
  616.                     (* if if not echoing    *)
  617.                 IfStmt(FALSE);
  618.             END;
  619.         END;
  620.     END;
  621.     LexAn.GetToken;
  622.  
  623. END PPStmt;
  624.  
  625. (*----------------------------------------------------------------------*)
  626. (*      Stmt    -->     IF | THEN | ELSE ELSIF | END | DEFINE | UNDEF   *)
  627. (*      Stmt    -->     INCLUDE | MACRO | ENDM | AND | OR | NOT | ID    *)
  628. (*      Stmt    -->     STRIP | NOSTRIP | LINE | SPACE                  *)
  629. (*      Stmt    -->     ',' | '(' | ')' | String | ch | Str | Block     *)
  630. (*      Stmt    -->     @ <PPStmt>                                      *)
  631. (*----------------------------------------------------------------------*)
  632.  
  633. PROCEDURE Stmt(Echo: BOOLEAN);
  634.  
  635. PROCEDURE StringOut(delim: CHAR);
  636. BEGIN
  637.     FIO.WriteChar(FSM.DestFile,delim);
  638.     FIO.WriteString(FSM.DestFile,FSM.Token.String);
  639.     FIO.WriteChar(FSM.DestFile,delim);
  640. END StringOut;
  641.  
  642. BEGIN
  643.  
  644.     WITH FSM.Token DO
  645.         WHILE NOT (Class IN FSM.LexSet{FSM.M2EOF,FSM.M2AtSign}) DO
  646.             IF Echo THEN
  647.                 CASE Class OF
  648.                 FSM.M2String:
  649.                     StringOut('"');
  650.                 |FSM.M2Str:
  651.                     StringOut(47C);
  652.                 ELSE
  653.                     FIO.WriteString(FSM.DestFile,String);
  654.                 END;
  655.             END;
  656.             LexAn.GetToken;
  657.         END;
  658.       (* POSTCONDITION:  When Stmt exits,     *)
  659.     END;
  660.       (* the current token is either EOF or @ *)
  661.  
  662. END Stmt;
  663.  
  664. (*----------------------------------------------------------------------*)
  665. (*      S       -->     { <Stmt> } EOF                                  *)
  666. (*----------------------------------------------------------------------*)
  667.  
  668. PROCEDURE Parse;
  669.  
  670. BEGIN
  671.  
  672.     LexAn.GetToken;
  673.     WITH FSM.Token DO
  674.         WHILE Class # FSM.M2EOF DO
  675.             Stmt(TRUE);
  676.             IF Class = FSM.M2AtSign THEN
  677.                 GetTokenThenSkipSpace;
  678.                 PPStmt(TRUE);
  679.             END;
  680.         END;
  681.       (* POSTCONDITION:  When Parse exits,    *)
  682.     END;
  683.       (* the current token is EOF             *)
  684.  
  685. END Parse;
  686.  
  687. (************************************************************************)
  688.  
  689.  
  690. PROCEDURE GetIncludeEnv;
  691.  
  692. VAR
  693.     IncEnv: ARRAY [0..1023] OF CHAR;
  694.     String: ARRAY [0.. 255] OF CHAR;
  695.  
  696. BEGIN
  697.     SymLists.Create(IncludeList);
  698.     MacLists.Insert(IncludeList,
  699. (* !!! error, final ' on line expected !!! *)
  700. (* !!! error, "END" expected, NOT "'',FSM.M2ID); (" !!! *)
  701. (* !!! error, "identifier" expected, NOT "'',FSM.M2ID); (" !!! *)
  702. (* !!! error, ";" expected, NOT "'',FSM.M2ID); (" !!! *)
  703. (* !!! error, "END" expected, NOT "'',FSM.M2ID); (" !!! *)
  704. (* !!! error, "identifier" expected, NOT "'',FSM.M2ID); (" !!! *)
  705. (* !!! error, "." expected, NOT "'',FSM.M2ID); (" !!! *)
  706. (* !!! error, END OF file expected, NOT "'',FSM.M2ID); (", FORMATTING STOPS !!! *)
  707. '',FSM.M2ID); (* current directory *)
  708.  Env.GetEnv('M2PInclude',IncEnv);
  709.  WHILE Env.ParseEnv(IncEnv,String) DO
  710.  MacLists.Insert(IncludeList,String,FSM.M2ID);
  711.  END;
  712.  SymLists.Reverse(IncludeList);
  713. END GetIncludeEnv;
  714.  
  715.  
  716. BEGIN
  717.  
  718.  PrintTrace := FALSE;
  719.  GetIncludeEnv;
  720. END Parser.
  721.