From f1aba7c2176c4ce7f6525b9c146cc50ead216d00 Mon Sep 17 00:00:00 2001 From: kaashoek Date: Wed, 25 Nov 1987 11:19:38 +0000 Subject: [PATCH] Initial revision --- util/ceg/EM_parser/common/pars.g | 348 +++++++++++++++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 util/ceg/EM_parser/common/pars.g diff --git a/util/ceg/EM_parser/common/pars.g b/util/ceg/EM_parser/common/pars.g new file mode 100644 index 000000000..4f85cec0f --- /dev/null +++ b/util/ceg/EM_parser/common/pars.g @@ -0,0 +1,348 @@ +{ + +#include +#include "decl.h" +#include "em.h" +extern char yytext[]; +extern int yylineno; +extern int first_action, last_action, token; + +t_token tok, stok; +int no_conversions = FALSE, library, segment = UNKNOWN; +File *outfile; +char *to_change; + +} + +%token C_INSTR, DEF_C_INSTR, CONDITION, ARROW, EQUIV, + CALL, ASSEM_INSTR, DEFAULT, ERROR; +%start table, table; +%start def_row, def_row; +%start c_table, c_table; +%lexical lex_analyzer ; + + +table : row* + ; + +row : C_INSTR { set_outfile( yytext); header( yytext);} + [ special | simple] { out( "}\n\n");} + + | DEF_C_INSTR { init_defaults( yytext);} + [ Dspecial | Dsimple] { handle_defaults();} + ; + +special : CONDITION { question( &yytext[0]);} + simple { out( "}\n");} + + [ CONDITION { out( "else "); question( &yytext[0]);} + simple { out( "}\n");} + ]* + + DEFAULT { out( "else {\n");} + simple { out( "}\n");} + ; + +simple : ARROW { set_segment( segment); save_output();} + actionlist { back_patch();} + + | EQUIV { no_conversions = TRUE; save_output();} + actionlist { no_conversions = FALSE; back_patch();} + + ; + + +actionlist : { first_action = TRUE;} + [ action { first_action = FALSE;} + [ ';' action]* + ]? + '.' + ; + +action : CALL { print_call( &yytext[0]);} + + | as_block { last_action = ( token == '.'); + do_block_assemble();} + + ; + +as_block : { init_as_block();} + ASSEM_INSTR { save_as( &yytext[0]);} + more_as + ; + +more_as : + %if ( next_token() == ASSEM_INSTR) + ';' + ASSEM_INSTR { save_as( &yytext[0]);} + more_as + | + ; + +Dspecial: CONDITION { out( " %s ", yytext);} + Dsimple + + [ CONDITION { out( " %s ", yytext);} + Dsimple + ]* + + DEFAULT { out( " %s ", yytext);} + Dsimple + ; + +Dsimple : ARROW { out( "%s", yytext);} + Dactionlist + + | EQUIV { out( "%s", yytext);} + Dactionlist + + ; + +Dactionlist : + [ Daction + [ ';' { out( ";\n");} + Daction + ]* + ]? + '.' { out( ".\n");} + ; + +Daction : CALL { out( "%s", yytext);} + + | ASSEM_INSTR { out( "\"%s\"", yytext);} + + ; + +def_row : [ special | simple] { out( "}\n\n");} + ; + +c_table : c_row* + ; + +c_row : %if ( strcmp( yytext, to_change) == 0) + C_INSTR { set_outfile( yytext); header( yytext);} + [ special | simple] { out( "}\n\n"); exit(0);} + + | C_INSTR + [ c_special | c_simple] + + | %if ( strcmp( yytext, to_change) == 0) + DEF_C_INSTR { init_defaults( yytext);} + [ Dspecial | Dsimple] { handle_defaults();exit(0);} + + | DEF_C_INSTR + [ c_special | c_simple] + ; + +c_special : CONDITION + c_simple + + [ CONDITION + c_simple + ]* + + DEFAULT + c_simple + ; + +c_simple: ARROW + c_actionlist + + | EQUIV + c_actionlist + ; + +c_actionlist : + [ c_action [ ';' c_action]* ]? '.' + ; + +c_action: CALL + | ASSEM_INSTR + ; + + +{ + +int saved = 0, token; + + +LLmessage( inserted_token) +int inserted_token; +{ + if ( inserted_token == 0) { + fprint( STDERR, "EM_table : syntax error in line %d, >>", + yylineno); + print_token( LLsymb); + fprint( STDERR, "<< will be deleted!!\n"); + } + else if ( inserted_token < 0) { + fprint(STDERR,"EM_table : stack overflow in line %d (fatal)!\n", + yylineno); + exit( 1); + } + else { + fprint( STDERR, "EM_table : syntax error in line %d, >>", + yylineno); + print_token( inserted_token); + fprint( STDERR, "<< will be inserted!!\n"); + token = LLsymb; + saved = 1; + } +} + +print_token( token) +int token; +{ + switch ( token) { + case C_INSTR : fprint( STDERR, "C_INSTR %s", yytext); + break; + case ASSEM_INSTR : fprint( STDERR, "STRING %s", yytext); + break; + case CALL : fprint( STDERR, "CALL %s", yytext); + break; + case ARROW : fprint( STDERR, "==> "); + break; + case EQUIV : fprint( STDERR, "::= "); + break; + case CONDITION: fprint( STDERR, "CONDITION %s", yytext); + break; + case DEFAULT : fprint( STDERR, "default "); + break; + case ERROR : fprint( STDERR, "unmatched %s", yytext); + break; + default : fprint( STDERR, " %c", token); + break; + } +} + +int lex_analyzer() +{ + extern char *next; + + if ( saved) { + saved = 0; + } + else { + token = mylex(); + *next = '\0'; + } + if ( token == C_INSTR) + set_C_instr_info( yytext); + return( token); +} + +int next_token() +{ + extern char *next; + + if ( !saved) { + token = mylex(); + *next = '\0'; + saved = 1; + } + return( 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 \n"); + out( "#include \"mach.h\"\n"); + out( "#include \"back.h\"\n\n"); + } +} + + +main( argc, argv) +int argc; +char **argv; +{ + outfile = STDOUT; + if ( argc > 1) { + if ( strcmp( argv[1], "-l") == 0) + library = TRUE; + else if( strcmp( argv[1], "-c") == 0) { + library = TRUE; + to_change = argv[2]; + c_table(); + fprint( STDERR, "No rule for %s\n", to_change); + return( 1); + } + } + else { + library = FALSE; + out( "#define CODE_EXPANDER\n"); + out( "#include \n"); + out( "#include \"mach.h\"\n"); + out( "#include \"back.h\"\n\n"); + } + + return( table()); +} + +} -- 2.34.1