Grammar PdfText Tokens NUMERIC = /-?(([0-9]*[.,_][0-9]+)|([0-9]+))/n SPACE = /\s+/n [:Skip] HEXSNIPPET = /[0-9A-F]+/in ALPHANUMERIC = /[A-Z0-9\-_?\.]+/in TEXTSNIPPET = /\(([^\)\\]|\\[\)\\]?)+\)/n TJSNIPPET = /\((\\\(|\([^\(\)]*\)|[^\)\\]|\\[\)\\]?)*\)/n IDENTIFIER = /^\/[\w:+\#\-\.]*(, ?[\w:+\#\-\.]*)*/n WORD = /[a-z\.]{2,}/in Productions Target -> 'BT' Exprs 'ET' [: _, values, _] Exprs -> Expr+ [^: values] Expr -> TmElement [^: val] | Array [^: val] | TDElement [^: val] | TdElement [^: val] | TcElement [^: val] | TWElement [^: val] | TfElement [^: val] | TjElement [^: val] | TrElement [^: val] | TjHex [^: val] | TStarElement [^: val] | TSElement [^: val] | TLElement [^: val] | TZElement [^: val] | RgElement[^: val] | Apostroph [^: val] | Quotes [^: val] | LineWidth [^: val] | UElement [^: val] Array -> '[' TJArrayElements /\]\s*TJ/n [: _, values, _] TmElement -> NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC NUMERIC 'Tm' [Tm: xscale, alpha, beta, yscale, tmx, tmy, _] TDElement -> NUMERIC NUMERIC 'TD' [TD: tdleadx, tdleady,_] TdElement -> NUMERIC NUMERIC 'Td' [Td: xpos, ypos,_] TcElement -> NUMERIC 'Tc' [Tc: charspace, _] TWElement -> NUMERIC 'Tw' [TW: wordspace, _] TfElement -> '/' ALPHANUMERIC NUMERIC 'Tf' [Tf: _, fontname, fontsize, _] TLElement -> NUMERIC 'TL' [TL: lead, _] TjElement -> TJSNIPPET 'Tj' [Tj: snippet, _ ] HexElement -> '<' HEXSNIPPET '>' [^: _, hex, _ ] | '<' '>' [^: _, _ ] TjHex -> HexElement 'Tj' [Tjhex: hexsnippet, _ ] TJArrayElements -> TJSingleElement+ [^: values ] TJSingleElement -> TJSNIPPET [: snippet ] | NUMERIC [: kerning ] | HexElement [: hexsnippet ] | '())' TSElement -> NUMERIC 'Ts' [Ts: textrise] TStarElement -> 'T*' [TStar: linebreak ] TZElement -> NUMERIC 'Tz' [Tz: hscaling] RgElement -> NUMERIC NUMERIC NUMERIC 'rg' [Rg: _, _, _, _] TrElement -> NUMERIC 'Tr' [Tr: render] Apostroph -> TJSNIPPET "'" [Apo: aposnippet, _] Quotes -> NUMERIC NUMERIC TJSNIPPET '"' [Quo: wordspace, charspace, aposnippet, _] LineWidth -> NUMERIC 'w' [Width: width, _] BTElement -> /^BT$/n [BT: _] ETElement -> /^ET$/n [ET: _] Hash -> '<<' (IDENTIFIER HashExpr)* '>>' [: _, pairs, _] HashExpr -> IDENTIFIER [^: val] | NUMERIC [^: val] | WORD [^: val] UElement -> NUMERIC NUMERIC NUMERIC NUMERIC 'k' | '/' ALPHANUMERIC /[gc]s/in | '/' ALPHANUMERIC Hash /BDC|BMC/ | 'EMC' | CNElements /scn?/in | NUMERIC /[gijJMG]/n | NUMERIC NUMERIC NUMERIC 'RG' | '[]' NUMERIC 'd' CNElements -> CNElement+ CNElement -> ALPHANUMERIC | '/' ALPHANUMERIC ALPHANUMERIC?