2013-08-25 87 views
3

我有句法謂詞,我必須轉換成Antlr 4.語法不會寫入我的,所以我不知道如何以有意義的方式轉換它們。這些是我必須轉換的語法的主要變體。句法謂詞 - 從Antlr 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

句法斷言只用於解決在ANTLR 3預測弱點是不存在的ANTLR 4.你根本就在轉換過程中刪除他們ANTLR 4

編輯:

在ANTLR 3句法謂語有以下形式:

(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 
) 
; 
+0

你能否給我提供一個例子,闡述上面的一個(最好是第二個) - 請參閱編輯。 –

+0

當我將其更改爲新的錯誤時,我收到了一個新錯誤我在代碼中提到了其中一個錯誤。請看看這個,並給我一些指導方針來解決這個問題。就像明智一樣,這個錯誤出現在每個$類型的代碼行中。 –

+0

@Diode該錯誤與句法謂詞無關。你應該爲它發佈一個新問題。 –