2011-04-05 16 views
0

我需要實現以下功能:我的語法可以接受兩個範圍的值,Value1Value2。如果我給出一個輸入:'set value1 100',它應該打印'Accepted'如何確定哪個解析器規則稱爲方法?

這很多工作正常。但我需要加強以下代碼:

  1. 無論何時我給出一些由數字以外的值組成的值,我都會打印自定義消息。
  2. 如果整數不在指定的範圍內,則會顯示自定義的錯誤消息,告訴該值不適合inbounds方法中的value1/value2。問題是,我怎麼知道誰叫入站?

我的代碼如下:

grammar grammar1; 

@parser::members { 
    private boolean inbounds(Token t, int min, int max) { 
    int n = Integer.parseInt(t.getText());  
    if(n >= min && n <= max) { 
     return true; 
    } 
    else { 
     System.out.println("Value does not lie in the specified range"); 
     return false; 
    } 
    } 
} 

expr  : SET attribute EOF; 

attribute : Value1 integer1 { System.out.println("Accepted"); } 
      | Value2 integer2 { System.out.println("Accepted"); } 
      ; 

integer1 : Int { inbounds($Int,0,1000) }? ; 
integer2 : Int { inbounds($Int,0,10000) }? ; 
Int  : '0'..'9'+; 

SET  : 'set'; 
Value1  : 'value'; 
Value2  : 'value2'; 
+0

ANTLR: expr:(Accepted_Values){Do_Something(); } | (for_all_other_values){Print_Error_Message(); } – Preeti 2011-04-06 08:39:18

回答

1

這個特殊的語法平凡答案:每當最大等於1000inbound已通過value表情叫,否則輸入的是一個value2表達。

0

我得到了我的第二個問題的解決方案:「我怎麼知道誰調用的方法進場」

以下語法解決這個問題:我們如何寫在這種情況下

grammar first1; 

@parser::members { 
private boolean inbounds(Token t, int min, int max, String methodName) { 
int n = Integer.parseInt(t.getText());  
if(n >= min && n <= max) { 
    return true; 
} 
else { 
    System.out.println("The range for value accepted by " + methodName+" is "+min +"-" + max); 
    return false; 
    } 
    } 
} 

expr  : SET attribute EOF; 

attribute : Value1 integer1["Value1"] { System.out.println("Accepted"); } 
      | Value2 integer2 ["Value2"] { System.out.println("Accepted"); } 
      ; 

integer1 [String methodName] : Int { inbounds($Int,0,1000,methodName) }? ; 
integer2 [String methodName] : Int { inbounds($Int,0,10000,methodName) }? ; 
Int  : '0'..'9'+; 

SET  : 'set'; 
Value1  : 'value'; 
Value2  : 'value2';