Section Header

    + name := AI_PARSER;

    - comment :="Startup system : First object.";

    - version := 1;

Section Inherit

    - parent_object:OBJECT :=

Section Public

    - msg_err:STRING;

    - trace:BOOLEAN;

    + position:INTEGER;

    + source:FAST_ARRAY[CHARACTER];

    - string_tmp:STRING;

    - last_character:CHARACTER <-

    - end_source:BOOLEAN <-

    - last_integer:INTEGER;

    - last_string:STRING_CONSTANT;

    - last_real_16_16:REAL_16_16;

    - last_flag:BOOLEAN;

    - is_new_line:BOOLEAN;

    - is_space:BOOLEAN <-

    - read_space:BOOLEAN <-

    - read_keyword s:STRING_CONSTANT :BOOLEAN <-

    - read_identifier:BOOLEAN <-

    - read_string:BOOLEAN <-

    - read_flag:BOOLEAN <-

    - read_integer:BOOLEAN <-

    - read_real_16_16:BOOLEAN <-

    - read_comment:BOOLEAN <-

    - read_character c:CHARACTER :BOOLEAN <-

Error Management


    - syntax_error txt:ABSTRACT_STRING <-

    - missing_keyword txt:ABSTRACT_STRING <-

    - print_line <-

    - get_line:INTEGER <-
Last read coordinates

    - last_x:REAL_16_16;

    - last_y:REAL_16_16;
Current Point

    - x_cur:REAL_16_16;

    - y_cur:REAL_16_16;

Section Public

    + llx:REAL_16_16;
        lower horizontal bound

    + urx:REAL_16_16;
        upper horizontal bound

    + lly:REAL_16_16;
        lower vertical bound

    + ury:REAL_16_16;
        upper vertical bound

    + width :INTEGER;

    + height:INTEGER;

Results


    + list_layer:LINKED_LIST[AI_LAYER];

    + current_list:LINKED_LIST[AI_OPERATION];

    + current_color:AI_COLOR;

Grammar Rules

++ DOCUMENT -> PROLOGUE
++ SCRIPT

    - read_document <-
++ PROLOGUE -> '%!PS-Adobe-2.0 EPSF-1.2'
++ [ comment ]
++ '%%BoundingBox:'real real real real
++ [ comment ]
++ '%%EndProlog'

    - read_prologue:BOOLEAN <-
++ SCRIPT -> SETUP
++ SCRIPT_BODY
++ TRAILER

    - read_script:BOOLEAN <-
++ SETUP -> '%%BeginSetup'
++ ['Adobe_illustrator_' real 'begin']
++ [PROC_SETS_INIT]
++ FONT_ENCODING
++ [PATTERN_DEFS]
++ '%%EndSetup'

    - read_setup:BOOLEAN <-
++ PROC_SETS_INIT -> { INITIALIZE }

    - read_proc_sets_init:BOOLEAN <-
++ INITIALIZE -> identifier '/initialize get exec'

    - read_initialize:BOOLEAN <-
++ FONT_ENCODING -> { RE_ENCODING }

    - read_font_encoding:BOOLEAN <-
++ RE_ENCODING -> '%%BeginEncoding:' newfontname oldfontname
++ Z
++ '%%EndEncoding'

    - read_re_encoding:BOOLEAN <-
++ Z -> '['[NEW_ENCODING]']' '/' identifier '/' identifier integer 'Z'

    - read_upper_z:BOOLEAN <-
++ NEW_ENCODING -> { integer '/' identifier { '/' identifier}}

    - read_new_encoding:BOOLEAN <-
++ PATTERN_DEFS -> { PATTERN }

    - read_pattern_defs:BOOLEAN <-
++ PATTERN -> '%%BeginPattern:' '('patternname')'
++ E
++ '%%EndPattern'

    - read_pattern:BOOLEAN <-
++ E -> '(' patternname ')' real real real real real [LAYER_LIST] 'E'

    - read_upper_e:BOOLEAN <-
++ LAYER_LIST -> { LAYER_COLOR LAYER_TILE }

    - read_layer_list:BOOLEAN <-
++ LAYER_COLOR -> '(' COLOR ')' '@'

    - read_layer_color:BOOLEAN <-
++ LAYER_TILE -> '(' TILE_DEFINITION ')' '&'
++ | '_' '&'

    - read_layer_tile:BOOLEAN <-
++ COLOR -> COLOR_COMPOSITE { COLOR_COMPOSITE }

    - read_color:BOOLEAN <-
++ COLOR_COMPOSITE -> flag 'O'
++ | flag 'R'
++ | real 'g'
++ | real 'G'
++ | real real real real 'k'
++ | real real real real 'K'
++ | real real real real '(' string ')' real 'x'
++ | real real real real '(' string ')' real 'X'

    - read_color_composite:BOOLEAN <-
++ TILE_DEFINITION -> OBJ_WITHOUT_COL

    - read_tile_definition:BOOLEAN <-
++ OBJECT -> COLOR { OBJ_WITHOUT_COL }

    - read_object:BOOLEAN <-
++ OBJ_WITHOUT_COL -> [ GRAPHICS_STATE ] { '%%Note:' comment } ( GRAPHIC | TEXT )

    - read_obj_without_col:BOOLEAN <-
++ GRAPHICS_STATE -> GRAPH_COMPOSITE { GRAPH_COMPOSITE }

    - read_graphics_state:BOOLEAN <-
++ GRAPH_COMPOSITE -> '[' { real } ']' integer 'd'
++ | integer ( 'j' | 'J' | 'M' )
++ | real ( 'i' | 'w' )

    - read_graph_composite:BOOLEAN <-
++ GRAPHIC -> PATH PAINT_OPERATOR

    - read_graphic:BOOLEAN <-
++ PATH -> COORD 'm' {PATH_COMPOSITE}

    - read_path:BOOLEAN <-
++ PATH_COMPOSITE -> COORD ( 'l' | 'L' )
++ | COORD COORD ( 'v' | 'V' | 'y' | 'Y' )
++ | COORD COORD COORD ( 'c' | 'C' )

    - read_path_composite:BOOLEAN <-
++ PAINT_OPERATOR -> 'N' | 'n' | 'F' | 'f' | 'S' | 's' | 'B' | 'b' | 'H' | 'h' | 'W'

    - read_paint_operator:BOOLEAN <-
++ TEXT -> '/' identifier real real real integer 'z' TEXT_COMPOSITE { TEXT_CONTENT } 'T'

    - read_text:BOOLEAN <-
++ TEXT_CONTENT -> [ integer ] '(' string ')' 't'

    - read_text_content:BOOLEAN <-
++ TEXT_COMPOSITE -> '[' real real real real real real ']' ( 'a' | 'e' | 'I' | 'o' | 'r' )

    - read_text_composite:BOOLEAN <-
++ COORD -> real real

    - read_coord:BOOLEAN <-
++ SCRIPT_BODY -> { ELEMENT | IMPORT_DOC }

    - read_script_body:BOOLEAN <-
++ ELEMENT -> { A }
++ GROUP | OBJECT

    - read_element:BOOLEAN <-
++ A -> flag 'A'

    - read_upper_a:BOOLEAN <-
++ GROUP -> ['*'] 'u'
++ OBJECT_SEQ
++ ['*'] 'U'
++ | 'q'
++ OBJECT_SEQ
++ 'Q'

    - read_group:BOOLEAN <-
++ OBJECT_SEQ -> { ELEMENT }

    - read_object_seq:BOOLEAN <-
++ IMPORT_DOC -> '''
++ '%%IncludeFile:' filename
++ '~'

    - read_import_doc:BOOLEAN <-
++ TRAILER -> '%%Trailer'
++ { TERMINATE }

    - read_trailer:BOOLEAN <-
++ TERMINATE -> (identifier '/terminate get exec' | '_E end')

    - read_terminate:BOOLEAN <-

Parser


    - create s:FAST_ARRAY[CHARACTER] :SELF <-

    - make s:FAST_ARRAY[CHARACTER] <-

    - draw b:BITMAP scale coef:REAL_16_16 <-