diff --git a/parser.y b/parser.y index 64f4268..1a3dbde 100644 --- a/parser.y +++ b/parser.y @@ -6,20 +6,29 @@ int integer; double fp; char *string; + struct { double width, double height } size; } %token INTEGER %token FLOAT %token STRING +%token PAGE_SIZE %token ELIPSIS +%token CM +%token INCH + %token EVEN %token ODD %token ALL +%token PORTRAIT +%token LANDSCAPE + %token FILE %token IMAGE +%token IMAGES %token ROTATE %token CROP %token SIZE @@ -30,48 +39,96 @@ %token BOOKMARK %token OUTPUT -%type range -%type ranges +%type image_range +%type image_ranges +%type page_range +%type page_ranges + +%type length %% -statements: statement | statements statement ; +statements: + statement + | statements statement ; -statement: input_statement | output_statement ; +statement: + input_statement + | output_statement ; -range: INTEGER ELIPSIS INTEGER +image_range: + INTEGER ELIPSIS INTEGER | INTEGER ; -ranges: range - | ranges ',' range ; +image_ranges: + image_range + | image_ranges ',' image_range ; file_clause: FILE STRING ';' ; image_clause: - IMAGE ranges ';' ; + IMAGE INTEGER ';' + | IMAGE INTEGER modifier_clause_list ';' ; + +images_clause: + IMAGES image_ranges ';' + | IMAGES image_ranges modifier_clause_list ';' + | IMAGES image_ranges part_clauses ';' ; rotate_clause: ROTATE INTEGER ';' ; +unit: + CM + | INCH ; + +length: + FLOAT + | FLOAT unit ; + crop_clause: - CROP FLOAT ',' FLOAT ';' ; + CROP PAGE_SIZE ';' + | CROP PAGE_SIZE orientation ';' + | CROP length ',' length ';' + | CROP length ',' length ',' length ',' length ';' ; + +orientation: + PORTRAIT + | LANDSCAPE ; size_clause: - SIZE FLOAT ',' FLOAT ';' ; + SIZE PAGE_SIZE ';' + | SIZE PAGE_SIZE orientation ';' + | SIZE length ',' length ';' ; + +modifier_clause: + rotate_clause | crop_clause | size_clause; + +modifier_clauses: + modifier_clause + | modifier_clauses modifier_clause; + +modifier_clause_list: + '{' modifier_clauses '}' ; part: EVEN | ODD | ALL ; part_clause: - part input_clause ; + part modifier_clause_list; + +part_clauses: + part_clause + | part_clauses part_clause; input_clause: - part_clause - | file_clause | image_clause | rotate_clause - | crop_clause | size_clause + file_clause + | image_clause + | images_clause + | modifier_clause | input_clause_list ; input_clauses: @@ -84,13 +141,21 @@ input_clause_list: input_statement: INPUT input_clauses ; +page_range: + INTEGER ELIPSIS INTEGER + | INTEGER ; + +page_ranges: + page_range + | page_ranges ',' page_range ; + page_clause: PAGE INTEGER ';' - | PAGE INTEGER ',' STRING ';' ; + | PAGE STRING ',' INTEGER ';' ; pages_clause: - PAGES ranges ';' - | PAGES ranges ',' STRING ';' ; + PAGES page_ranges ';' + | PAGES STRING ',' page_ranges ';' ; bookmark_clause: BOOKMARK INTEGER ',' STRING ';' diff --git a/scanner.l b/scanner.l index 36e1171..431dc23 100644 --- a/scanner.l +++ b/scanner.l @@ -14,19 +14,48 @@ alpha [a-zA-Z] \.\. { return (ELIPSIS); } {digit}+ { yylval.integer = atoi (yytext); return (INTEGER); } +{digit}+.{digit}* { yylval.float = atof (yytext); return (FLOAT); } + +a { yylval.size.width = 8.5 * 25.4; + yylval.size.height = 11.0 * 25.4; + return (PAGE_SIZE); } +b { yylval.size.width = 11.0 * 25.4; + yylval.size.height = 17.0 * 25.4; + return (PAGE_SIZE); } +c { yylval.size.width = 17.0 * 25.4; + yylval.size.height = 22.0 * 25.4; + return (PAGE_SIZE); } +d { yylval.size.width = 22.0 * 25.4; + yylval.size.height = 34.0 * 25.4; + return (PAGE_SIZE); } +e { yylval.size.width = 34.0 * 25.4; + yylval.size.height = 44.0 * 25.4; + return (PAGE_SIZE); } all { return (ALL); } bookmark { return (BOOKMARK); } +cm { return (CM); } crop { return (CROP); } even { return (EVEN); } file { return (FILE); } image { return (IMAGE); } +images { return (IMAGES); } +inch { return (INCH); } input { return (INPUT); } +landscape { return (LANDSCAPE); } odd { return (ODD); } output { return (OUTPUT); } page { return (PAGE); } pages { return (PAGES); } +portrait { return (PORTRAIT) ; } rotate { return (ROTATE); } size { return (SIZE); } \".*\" { yylval.string = newstr (yytext); return (STRING); } + +[ \t\n]+ /* whitespace */ + +--.* /* Ada/VHDL style one-line comment */ + +. { printf( "Unrecognized character: %s\n", yytext ); } +