3

私はAntlr 4に変換しなければならない構文述語を持っています.文法は私が書いたものではないので、意味のある方法でそれらを変換する方法がわかりません. これらは、私が変換しなければならない文法の主なバリエーションです。

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?
        ')'
    ;

いくつかのガイダンスをいただければ幸いです。

編集:

以下のとおりでしょうか。

    simpleSelector
    : elementName 
        (elementSubsequent)*

    | (elementSubsequent)+
    ;
4

1 に答える 1

4

構文述語は、ANTLR 4 には存在しない ANTLR 3 の予測の弱点を回避するためにのみ使用されました。ANTLR 4 への移行中に単純に削除できます。

編集:

ANTLR 3 の構文述語には、次の形式がありました。

(stuff) =>

文法でそのフォームが表示されている場合は、削除してください。述語を削除した 2 番目の例は次のようになります。

    NUMBER
    :(
      '0'..'9' ('.' '0'..'9'+)?
    | '.' '0'..'9'+
    )
    (
        E
        (
              M     { $type = EMS;          }
            | X     { $type = EXS;          }
        )
    |   P
        (
              X     
            | T
            | C
        )
                    { $type = LENGTH;       }   
    |   C M         { $type = LENGTH;       }
    |   M
        (
              M     { $type = LENGTH;       }

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

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

    |   S        { $type = TIME;         }

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

    | IDENT         { $type = DIMENSION;    }

    | '%'           { $type = PERCENTAGE;   }

    | // Just a number
)
;
于 2013-08-25T18:53:59.260 に答える