home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR9 / SYACC131.ZIP / SYACC.DOC < prev    next >
Text File  |  1993-11-11  |  13KB  |  245 lines

  1.  
  2. ╔═════════════════════════════════════════════════════════════════════════════╗
  3. ║                                                                             ║
  4. ║                                  SYACC                                      ║
  5. ║                              Version 1.3.1                                  ║
  6. ║                                                                             ║
  7. ║                             by David H. Chen                                ║
  8. ║                              November  1993                                 ║
  9. ║                                                                             ║
  10. ╚═════════════════════════════════════════════════════════════════════════════╝
  11.  
  12.  
  13. I.  Introduction
  14.  
  15.    This program is a LALR(1) parser generator.
  16.  
  17.    It generates a look-ahead LR(1) parser from an argumented grammar.
  18.    The generated parser is a left-to-right scanning of the input (L) and
  19.    constructing from the rightmost derivation first (R).  It look-ahead one
  20.    input symbol (not a character symbol).  It is a "C" source code that will
  21.    recognize a language that described by the production rules (grammar).
  22.    A grammar that can be translated into a LR driver program with parsing
  23.    table is called a LR grammar.  A LR grammar is a context-free grammar.
  24.    For most of the porgramming languages, they can be described by
  25.    a LR grammar.
  26.  
  27.    A skim of the process in the SYACC:
  28.    First, the production rules are parsed into a list.  For each symbol, the
  29.    "FIRST" and "FOLLOW" are constructed.  They are also included in a list.
  30.    Meanwhile, the propagated "A -> ε" issue is taken cared.  The last
  31.    step is to construct the LALR parsing table.
  32.  
  33.  
  34. II.  User's Guide
  35.  
  36.    1.  Usage
  37.  
  38.       After dos prompt, type:
  39.  
  40.       syacc <infile> [<outfile>] [<switchs>]
  41.  
  42.       Where:  []        means optional.
  43.               <infile>  is the input file name.
  44.               <outfile> is the output file name. It is optional.
  45.                         The default file name is "lrparser.c".
  46.               <switchs> has following switchs:
  47.                -n    No Main function -
  48.                      The default is to create a file that has "main()".
  49.                      When this switch is present, no "main()" is generated.
  50.                      The user is preparing this file to link with other program.
  51.                -m    Print processing message on screen -
  52.                      The default is no message sends from SYACC to screen.
  53.                      Using the switch to print processing message on screen from
  54.                      the SYACC.  It reports processing status.
  55.                -e    Exit program on error -
  56.                      The default is to continue the program execution even an
  57.                      error found.  However, this will set program into an
  58.                      unexpected environment.  When this switch is present, the
  59.                      program exit if an error is found (in the input file).
  60.                -d    Create file 'syacc.out' -
  61.                      This file has symbols, production rules, items and messages
  62.                      information.   This file is for use's reference to debug
  63.                      the grammar.  It also shows what the SYACC based to create
  64.                      the parsing table.
  65.                -sN   Create N version number of parser -
  66.                      User can specify the parser's version number so that
  67.                      more than two parsers can be linked into a program.
  68.                      This makes a program can have multiple parsers that
  69.                      generated by the SYACC.  The default of N is 0.
  70.                -h    Generated the parsing table file -
  71.                      When the parsing table is too large to initialize in
  72.                      source code, this is an alternative to generate the
  73.                      parsing table file which will be read in at the
  74.                      initialization.  The file's name is 'lalr?.tbl'.  The '?'
  75.                      is the version number - default is 0.  If this switch
  76.                      is presented, the generated parser is required to compile
  77.                      in 'huge' memory model.
  78.                -b    Create the virtual memory file 'syacc.vm' -
  79.                      The user can provide a file path by using "-bfile_path" to
  80.                      replace the file 'syacc.vm'.  This file can be used when
  81.                      the message "Out of core" showed by the SYACC.  When the
  82.                      RAM is short, the SYACC can use hard disk space for
  83.                      swapping out data to make room for execution.  If this
  84.                      switch is not presented, the SYACC will use RAM only.
  85.  
  86.  
  87.    2.  Input File
  88.  
  89.        The file that is accepted by the SYACC can be divided into four areas
  90.        by the line begin with "%%".
  91.  
  92.        A.  The first area is the DECLARATIONS area.  The SYACC will copy all
  93.            lines in this area into the begining of the output file.
  94.            The macro definitions: 'PA_STACK_TYPE', 'TOKEN_VALUE', 'LEXER', and
  95.            'LRPARSER' define the value type of the 'TOKEN_VALUE', the name of
  96.            the 'TOKEN_VALUE', the name of the LEXER and name of the LR parser.
  97.            The default of these macros are 'char *', 'token_value', 'lexer?',
  98.            and 'lrparser?' accordingly.  This allows user to re-define these
  99.            names for multiple parsers program.  The '?' is the version number
  100.            - default is 0.
  101.  
  102.        B.  The second area is the RESOLUTION area.  The SYACC will consult
  103.            this area's definition when a shift/reduce or a reduce/reduce
  104.            conflict.  It uses '%left' to denote left associative and '%right'
  105.            right associative.  The precedence is decided by the order of the
  106.            appearence in this area.  Hence, the later the symbols appears,
  107.            the higher the precedence.  The SYACC will use defaults if the
  108.            definitions in this area can not solve the conflict.
  109.            The default for shift/reduce conflict is in favor of shift and for
  110.            reduce/reduce conflict is for the production rule that appears first.
  111.  
  112.        C.  The third area is the TRANSLATION RULES area.  It contains the LR
  113.            grammar's production rules and their associated semantic actions.
  114.            Each rule should have the following format:
  115.  
  116.            <left-hand-side> : <alt 1> { <semantic action 1> }
  117.                             | <alt 2> { <semantic action 2> }
  118.                           .....
  119.                             | <alt n> { <semantic action n> }
  120.                             | /* this denotes the ε */
  121.                             ;
  122.  
  123.                where,
  124.                       <left-hand-side>     is always a non-terminal symbol.
  125.                       <alt n>     is a sequence of non-terminals and terminals.
  126.                       <semantic action n>     is a section of code will be
  127.                                 executed when this production is recognized.
  128.  
  129.            All tokens other than non-terminal symbol is treated as terminals.
  130.            The token must start with a alphabet.  Rest of the letter in the
  131.            token can be any charater.  Character symbols has two "'" quoted
  132.            to be a terminal symbol.  For example, '->' is a terminal;
  133.            but, -> is an error.  Any number of character symbols can be in
  134.            these two "'" quotes.
  135.  
  136.            In this area, it is case sensitive.  Therefore, an "If" is
  137.            different from an "if".  When a lexical analyzer returns token,
  138.            it must match the upper/lower case to the symbol in the rules.
  139.  
  140.            In the semantic action, it can has a section of the 'C' code.
  141.            However, $$ and $n are reserved.  The $$ means the left-hand-side's
  142.            value.  Those $n (n is a positive number) are the symbol's value
  143.            corresponding to the ordinal sequence of the symbols at the
  144.            right hand side.  (in the <alt n>)  They are pointers of the value
  145.            type that is defined by the macro 'PA_STACK_TYPE' - the same as
  146.            the variable 'token_value' is declared.
  147.  
  148.            A '//' signifies the start of a comment string.
  149.            Any letter follows it will be ignored by the SYACC.
  150.  
  151.            The presented sequence of the production rules is important in
  152.            parsing table  construction.  When a reduce/reduce conflict found,
  153.            the SYACC will use the one that appear first.  Also, the left-hand
  154.            side of the first production rule must be the "start symbol".
  155.  
  156.            For error recovery, a production rule A -> error ... can serve
  157.            the purpose.  The error is a reserve terminal symbol for the SYACC.
  158.            The ... must be a sequence of terminals.   Also, the error must be
  159.            at the first right-hand-side.  The parser that is generated by the
  160.            SYACC will trigger the error recovery routine as soon as an error
  161.            is encountered.   When an error occurred, the parser will popup
  162.            the states (and symbols) in the stack until a state that has the
  163.            error production.   Then, it will discard any input symbol that does
  164.            not match with the following terminals of the error symbol in this
  165.            production's right-hand-side.  After the matching is complete, it
  166.            will reduce this production rule and trigger the semantic action.
  167.            Afterward, the mormal parsing is resumed.
  168.  
  169.  
  170.        D.  The fourth area is the AUXILIARY FUNCTIONS area.  The SYACC will
  171.            copy every line in this area to the end of the output file.
  172.            This area is used by user to provide supporting functions and main
  173.            functions (if any) to complete the parser.
  174.  
  175.  
  176.    3.  Output File
  177.  
  178.        The output file is the LALR(1) parser's 'C' source code.
  179.  
  180.        There are two possible output files:
  181.        One is the file contains the "main()" function.  The user can produce
  182.        an ".exe" file directly from this file.
  183.        Another is a file without the "main()" function.  The user can link
  184.        this file with his program later.
  185.        In either case, the function "int lrparser?()" is generated in the
  186.        output file.  It returns 0 if successfully parsed; Otherwise, errors.
  187.        The '?' is the version number - default is 0.
  188.  
  189.        The generated parser expects to get a token each time it calls the
  190.        function "char* LEXER()".   This function will return 0 if error
  191.        occurred and a "" string if no more token is available.  It is the
  192.        only input from this parser.
  193.  
  194.        It also expects 'TOKEN_VALUE' variable contains the returning
  195.        token's value in which the token returns by the 'LEXER()' function.
  196.        This variable must be a pointer and its data type is defined by the
  197.        'PA_STACK_TYPE' macro.  The default is 'char*'.  User can change it by
  198.        using '#define PA_STACK_TYPE ...' in the declaration area.  Also, this
  199.        token_value is associated with $n that defined in the semantics rules.
  200.  
  201.  
  202.    4.  Examples
  203.  
  204.        A typical development procedure of a lrparser can be described
  205.        as following:
  206.  
  207.          INPUT                          OUTPUT
  208.         =========                   =================
  209.         yacc.259   -> SYACC      ->    p259.c
  210.         p259.c     -> c-compiler ->    p259.exe
  211.         INPUT      -> p259.exe   ->    results (actions and values)
  212.  
  213.        where,
  214.                yacc.259 is the file which has the SYACC's input format
  215.                p259.c   is the lrparser with parsing table in "C".
  216.                p259.exe is the LR parser.
  217.  
  218.       Other two examples are included - yacc.262 and yacc.266.
  219.       To see how these files work, use 259.bat, 262.bat and 266.bat files.
  220.       These batch files use the example and build '.exe' files.  They assumes
  221.       you have the Microsoft C compiler environment preset.  If using other
  222.       compiler, you have to change the line "cl ..." in the batch files to
  223.       your compiler's command line features.
  224.  
  225.  
  226. III.  HISTORY
  227.  
  228.    - Version 1.3.1   November 1993,
  229.                      Modify for the generated parser using memory effectively.
  230.    - Version 1.3     September 1993,
  231.                      Add generating parsing table file to cope with large scale
  232.                      array initialization issue in the parser.
  233.    - Version 1.2     September 1993,
  234.                      Add linking mutil-generated-parsers in one program.
  235.    - Version 1.1     August 1993,
  236.                      Add error recovery function.
  237.                      Using more effective algorithm.
  238.    - Version 1.0     June 1993,
  239.                      Bugs fix and using 16 and 32 bits program.
  240.    - Version 0.9     May 1990,
  241.                      Initial work completed in C++.
  242.  
  243.  
  244.  
  245.