compile.awk
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
- # to run: awk -f transit.awk transit.p0
- #
- BEGIN { "date" | getline
- enable_index = 1
- today = $0
- printf("n/* this file was generated on %s */n", today )
- not_firstone = 0 # flag to avoid empty entry in 1st table
- fpe = 0 # entry tbl array fill pointer
- fpeo = 0 # entry tbl offset list fill pointer
- fpdef = 0 # define list fill pointer
- }
- ### /^;/ { } # line starting with a semicolon is comment
- /^[A-Z]/ { # table name
- if ( $1 == "TABLE" ) {
- tbl = $2 # get table name
- newtbl( tbl )
- }
- else if ( $1 == "COMPILE" ) {
- array_name = $2
- if ( $3 == "NOINDEX" ) { enable_index = 0 }
- }
- else { # table entry
- ec = ec +1
- n = split( $0, fld, " " )
- action = fld[ n-1 ]
- newstate = fld[ n ]
- store( action, newstate )
- ecct = ecct +1
- }
- }
- END { store( action, newstate )
- if ( enable_index ) {
- printf( "n/* index name #defines: */nn",
- ec, ecct )
- for( ii = 1; ii <= fpeo; ii++ ){
- printf( "#define %-12s %3dn", define[ ii ], ii -1 )
- }
- }
- printf( "nn/* size of transition table is %d bytes */n",
- fpe )
- if ( enable_index ) {
- printf( "nstatic short int %s_offset [ ] ={", array_name )
- for( ii = 1; ii <= fpeo; ii++ ){
- if ( (ii % 10) == 1 ) printf("n ")
- printf( " %4d", entry_offset[ ii ] )
- if ( ii < fpeo ) printf( "," )
- }
- printf(" };n")
- }
- printf( "nstatic char %s_entry [ ] = {", array_name )
- for( ii = 1; ii <= fpe; ii++ ){
- if ( (ii % 6) == 1 ) printf("n ")
- printf( " %-14s", entry[ ii ] )
- if ( ii < fpe ) printf( "," )
- }
- printf(" };n")
- }
- function store( act, ns ){
- # printf( "%s %sn", act, ns )
- entry[ ++fpe ] = act
- entry[ ++fpe ] = ns
- }
- function newtbl( tbl ){
- if ( not_firstone ) {
- store( action, newstate )
- }
- not_firstone = 1
- entry_offset[ ++fpeo ] = fpe # entry tbl offset list
- define[ ++fpdef ] = tbl # state name to define
- }