我需要实现以下功能:我的语法可以接受两个值范围,Value1
和Value2
。如果我提供输入:'set value1 100'
,则应打印'Accepted'
。
这很好。但我需要增强代码,以便:
我的代码如下:
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 :(得分: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';