Some routines moved to 'help.c'
authorkaashoek <none@none>
Fri, 18 Dec 1987 16:23:42 +0000 (16:23 +0000)
committerkaashoek <none@none>
Fri, 18 Dec 1987 16:23:42 +0000 (16:23 +0000)
util/ceg/EM_parser/common/pars.g

index 4f85cec..230257c 100644 (file)
@@ -1,8 +1,38 @@
+/* This file contains the parser for the 'EM_table'.
+ * Every row in the table is converted to a C-function.
+ * The parser is a fairly simple program, for each row it prints a function-
+ * header and the following actions are printed as C-statements. A CALL is just
+ * copied, and an ASSEM_INSTR will be handed to the routine assemble().
+ * Assemble() will turn the assembly-string into a sequence of C-function calls.
+ * How this should be done is expressed in the 'as_table'.
+ *
+ * There are however some complicating factors:
+ *     - A row in the 'EM_table' may contain CONDITION's. 
+ *       The parser supports this by outptutting some "if" and "else"'s.
+ *
+ *     - The user is allowed to use some abbreviation in the 'EM_table', (s)he
+ *       can use the DEF_C_INSTR's ( e.g. C_loe..).
+ *       One such DEF_C_INSTR must be expanded in 3 or more C-functions.
+ *       The solution is to copy the DEF_C_INSTR to a temporary file. Then
+ *       this file will be processed as many times as needed to generate all
+ *       the C-functions.
+ *
+ *     - The assembler-instructions must be processed in blocks not one at a
+ *       time, so buffering is needed.
+ *
+ *     - When generating object-code, the user can make use of the dist()
+ *       function. This function should return the number of bytes between
+ *       the current instruction and a labelled one, both forward and backward
+ *       references must be handled.
+ *       This requires the saving of the generated function, and 
+ *       backpatching in a second phase.
+ */
 {
 
 #include <system.h>
 #include "decl.h"
 #include "em.h"
+
 extern char yytext[];
 extern int yylineno;
 extern int first_action, last_action, token;
@@ -79,6 +109,9 @@ more_as :
        |
        ;
 
+
+/* Grammar rules for a default-instruction, just copy to a temporary file. */
+
 Dspecial: CONDITION            { out( " %s ", yytext);}
          Dsimple               
 
@@ -116,6 +149,13 @@ Daction    : CALL                  { out( "%s", yytext);}
 def_row        : [ special | simple]   { out( "}\n\n");}
        ;
 
+
+
+/* This is a grammar to handle the -c flag ( only one entry has changed).
+ * Skip all entries in the table until the one that has changed, then
+ * use the grammar rules for the normal case above.
+ */
+
 c_table        : c_row*
        ;
 
@@ -161,6 +201,9 @@ c_action: CALL
        ;
 
 
+
+
+
 {
 
 int saved = 0, token;
@@ -215,6 +258,15 @@ int token;
        }
 }
 
+
+/* The lexical analyzer.
+ *     It uses mylex() to get the tokens.
+ *     It supports the buffering of one token.
+ *     If the curent token is a C_INSTR it will set the global variable
+ *     'C_instr_info' to point to the correct information ( arguments, header,
+ *     etc.).
+ */
+
 int lex_analyzer()
 {
        extern char *next;
@@ -244,79 +296,12 @@ int next_token()
 }
 
 
-set_segment( seg)
-int seg;
-{
-       switch ( seg) {
-         case SEGTXT : out( "switchseg( SEGTXT);\n");
-                        break;
-         case SEGBSS  : out( "switchseg( SEGBSS);\n");
-                        out( "dump_label();\n");
-                        break;
-         case SEGHOL  : out( "switchseg( SEGHOL); BESTAAT NIET!!\n");
-                        break;
-         case SEGCON  : out( "switchseg( SEGCON);\n");
-                        out( "dump_label();\n");
-                        break;
-         case SEGROM  : out( "switchseg( SEGROM);\n");
-                        out( "dump_label();\n");
-                        break;
-         case UNKNOWN : break; /* dan niet! */
-       }
-}
-
-
-out( fmt, argv)
-char *fmt;
-int argv;
-{
-       doprnt( outfile, fmt, &argv);
-}
-
-
-char *suffix( str, suf)
-char *str, *suf;
-{
-       static char res[15];
-       char *s, *strncpy(), *strcat();
-       int strl, sufl, prefl;
-
-       strl = strlen( str);
-       sufl = strlen( suf);
-
-       for ( s = str + strl; --s >= str && *s != '.';)
-               ;
-
-       if ( *s == '.')
-               prefl = s - str;
-       else
-               prefl = strl;
-       
-       if ( prefl + sufl + 1 > 14 )
-               prefl = 14 - 1 - sufl;
-       
-       strncpy( res, str, prefl);
-       res[prefl] = '\0';
-       s = strcat( res, ".");
-       s = strcat( s, suf);
-       return( s);
-}
-
-set_outfile( name)
-char *name;
-{
-       if ( library) {
-               name = suffix( name, "c");
-               sys_close( outfile);
-               if ( !sys_open( name, OP_WRITE, &outfile))
-                       fprint( STDERR, "!! can't create %s !!\n", name);
-               out( "#define CODE_EXPANDER\n");
-               out( "#include <em.h>\n");
-               out( "#include \"mach.h\"\n");
-               out( "#include \"back.h\"\n\n");
-       }
-}
+/******************************************************************************/
 
+/* Handle arguments :
+ *     -l              : Library, generate one function per file.
+ *     -c <name>       : Change, only update the <name> file.
+ */
 
 main( argc, argv)
 int argc;
@@ -336,10 +321,7 @@ char **argv;
        }
        else {
                library = FALSE;
-               out( "#define CODE_EXPANDER\n");
-               out( "#include <em.h>\n");
-               out( "#include \"mach.h\"\n");
-               out( "#include \"back.h\"\n\n");
+               file_header();
        }
        
        return( table());