module ec; import system; const S_char = 0; S_module = 1; var col : integer; row : integer; look : char; sym : integer; procedure Err0( s : array of char ); begin system.writestring( "Error line " ); system.writeinteger( row ); system.writestring( ", pos " ); system.writeinteger( col ); system.writestring( ": " ); system.writeline( s ); end (* TODO: segfault when defining parameter *) procedure Err1N( s : array of char, n : integer ); begin system.writestring( "Error line " ); system.writeinteger( row ); system.writestring( ", pos " ); system.writeinteger( col ); system.writestring( ": " ); system.writestring( s ); system.writestring( " " ); system.writeinteger( n ); end procedure Halt; begin system.halt( 1 ) end procedure Abort0( s : array of char ); begin Err0( s ); Halt; end procedure Abort1N( s : array of char, n : integer ); begin Err1N( s, n ); Halt; end (* scanner *) procedure getChar : char; var c : char; begin c := system.readchar( ); if ( c = char( 0 ) ) do return c; end; col := col + 1; if ( c = char( 10 ) ) do col := 1; row := row + 1; end; return c; end procedure isWhite( c : char ) : boolean; begin if ( c = char( 0 ) ) or ( c = char( 10 ) ) or ( c = char( 13 ) ) or ( c = char( 9 ) ) do return true else return false end end procedure skipWhite; begin while ( isWhite( look ) ) do look := getChar( ); end end procedure getSym : integer; begin skipWhite; return S_char; end (* parser *) procedure Expect( expect : integer ); begin if ( sym = expect ) do sym := getSym( ); else (* TODO: symtable names Abort( "Expected symbol", symname[expect] ); *) Abort0( "Expected symbol" ); end end procedure init; begin col := 1; row := 1; look := getChar( ); sym := getSym( ); end procedure prologue; begin system.writeline( "[bits 32]" ); system.writeline( "cpu 486" ); system.writeline( "org 0x1000000" ); end procedure doModule; begin Expect( S_module ); (* look := getChar( ); while ( look <> char( 0 ) ) do if not isWhite( look ) do system.writechar( look ); end; look := getChar( ); end; *) end procedure epilogue; begin system.writeline( "hlt" ); end begin prologue; init; doModule; epilogue; system.halt( 0 ); end