如何确定,哪个解析器规则称为方法?

时间:2011-04-05 11:04:01

标签: java antlr

我需要实现以下功能:我的语法可以接受两个值范围,Value1Value2。如果我提供输入:'set value1 100',则应打印'Accepted'

这很好。但我需要增强代码,以便:

  1. 每当我提供一些由数字以外的任何值组成的值时,我都会打印一条自定义消息。
  2. 如果整数不在指定范围内,我会显示一条自定义错误消息,告知该值不适合inbounds方法中的value1 / value2。问题是,我怎么知道是谁打过来的?
  3. 我的代码如下:

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

2 个答案:

答案 0 :(得分:1)

这个特殊语法的简单答案:当max等于1000时,inbound已通过value表达式调用,否则输入为value2表达式。

答案 1 :(得分:0)

我为第二个问题找到了一个解决方案:'我怎么知道是谁调用了这个方法inbounds'

以下语法正在解决这个问题:

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