句法谓词-从Antlr3升级到Antlr4



我有语法谓词,必须转换为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)+
    ;

句法谓词仅用于解决ANTLR 3中的预测弱点,而ANTLR 4中不存在该弱点。你可以在过渡到ANTLR 4的过程中简单地删除它们。

编辑:

ANTLR3中的一个句法谓词具有以下形式:

(stuff) =>

只要你在语法中看到那个形式,就把它去掉。下面是你的第二个例子去掉谓词后的样子。

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

相关内容

  • 没有找到相关文章

最新更新