predicados sintácticos: actualización de Antlr 3 a Antlr 4

Tengo una síntesis sintáctica que debo convertir en Antlr 4. La gramática no está escrita en mi yo, así que no tengo idea de cómo convertirlos de una manera significativa. Estas son las principales variaciones de la gramática que tengo que convertir.

1.

    simpleSelector
    : elementName 
        ((esPred)=>elementSubsequent)*

    | ((esPred)=>elementSubsequent)+
    ;

    esPred
    : HASH | DOT | LBRACKET | COLON
    ;

    elementSubsequent
    : HASH
    | cssClass
    | attrib
    | pseudo
    ;

2.

        fragment    EMS         :;  // 'em'
        fragment    EXS         :;  // 'ex'
        fragment    LENGTH      :;  // 'px'. 'cm', 'mm', 'in'. 'pt', 'pc'
        fragment    ANGLE       :;  // 'deg', 'rad', 'grad'
        fragment    TIME        :;  // 'ms', 's'
        fragment    FREQ        :;  // 'khz', 'hz'
        fragment    DIMENSION   :;  // nnn'Somethingnotyetinvented'
        fragment    PERCENTAGE  :;  // '%'

        NUMBER
            :(
              '0'..'9' ('.' '0'..'9'+)?
            | '.' '0'..'9'+
            )
            (
              (E (M|X))=>
                E
                (
                      M     { $type = EMS;          } //action in lexer rule 'NUMBER' must be last element of single outermost alt  

                    | X     { $type = EXS;          }
                )
            | (P(X|T|C))=>
                P
                (
                      X     
                    | T
                    | C
                )
                            { $type = LENGTH;       }   
            | (C M)=>
                C M         { $type = LENGTH;       }
            | (M (M|S))=> 
                M
                (
                      M     { $type = LENGTH;       }

                    | S     { $type = TIME;         }
                )
            | (I N)=>
                I N         { $type = LENGTH;       }

            | (D E G)=>
                D E G       { $type = ANGLE;        }
            | (R A D)=>
                R A D       { $type = ANGLE;        }

            | (S)=>S        { $type = TIME;         }

            | (K? H Z)=>
                K? H    Z   { $type = FREQ;         }

            | IDENT         { $type = DIMENSION;    }

            | '%'           { $type = PERCENTAGE;   }

            | // Just a number
        )
    ;

3. 

    URI :   U R L
        '('
            ((WS)=>WS)? (URL|STRING) WS?
        ')'
    ;

alguna orientación es muy apreciada

Editar:

Es como esta abajo

    simpleSelector
    : elementName 
        (elementSubsequent)*

    | (elementSubsequent)+
    ;

Respuestas a la pregunta(1)

Su respuesta a la pregunta