QLexpress 스 크 립 트 언어 기술 설명 (8) --- - 논리 적 처리

(비고: 관련 코드 참고 com. ql. util. express. test. logic. ShortCircuitLogicTest 클래스,
QLExpress 소스 코드 다운로드 주소:http://code.taobao.org/p/QLExpress/src/ )
 
어제 공장 외부 인사 의 메 일 을 받 았 는데 요 구 는 다음 과 같 습 니 다.
  ,  !
 
             BLOG     QLExpress   ,                  :
                   
                 QLExpress                ,        true/false            
        
          :
          .   =='  ' && (  .   > 2  ||   .  =='VIP')
 
                true/false ,          ,             (   、                   );、、
 
            QL       ,      QLExpress   ,                     。

 
 
사실 논리 적 인 통 제 는 약 2 년 전에 우 리 는 이미 실현 되 었 고 타 오 바 오 내부 업무 시스템 도 많이 사용 되 었 다.물류 보, 마 케 팅 시스템, 감독 시스템 등.
 
두 가지 요 구 를 포함 합 니 다.
1. 모든 오류 정 보 를 출력 해 야 하기 때문에 논리 적 단락 을 피한다.
2. 오류 메 시 지 를 우호 적 으로 표시 합 니 다.
 
해답: 1
첫 번 째 문 제 는 잘 해결 되 었 습 니 다. runner 속성 을 설정 하면 됩 니 다. 이 설정 은 많은 장면 에서 유용 합 니 다. (즉, 모든 표현 식 을 실행 하고 마지막 결 과 를 얻 고 싶 습 니 다)
runner.setShortCircuit(true);

 
해답: 2
 
ExpressRunner.addOperatorWithAlias(String keyWordName, String realKeyWordName,String errorInfo)
'조작 부호 이름 바 꾸 기' 라 는 아름 다운 이름 을 가 진 이 함 수 는 사실 잘못된 정 보 를 논리 적 으로 판단 하기 위 한 디자인 이다.
 
예 를 들 어 저 는 (100 이 99 보다 작 을 때) 잘못 보고 하면 '<' 를 다시 정의 할 수 있 습 니 다.
runner. addOperator WithAlias ("작 음", "<" $1 이 $2 보다 작 으 면 기 대 를 충족 시 키 지 못 합 니 다 ");
이렇게 하면 오류 메시지 가 표 시 됩 니 다. 100 이 99 보다 작 으 면 기대 에 만족 하지 않 습 니 다.
그럼 어떤 형님 들 은 고민 하 실 거 예요. 제 가 표현 식 내용 이 라면... (100 < 99) 가 아니 라 (100 이 99 보다 작 음) 어 떡 하지?
ExpressRunner 내부 의 조작 부호 체계 설계 에 제한 을 받 기 때문에 우 리 는 타협 을 해서 먼저 문자 교체 작업 을 할 수 밖 에 없다.
 
text = "100<99 and 100<=99 and 100>1";
text = text.replaceAll("<",“  ”).replaceAll("<=",“     ”).replaceAll(">","  ");
runner.setShortCircuit(true);
runner.addOperatorWithAlias("  ","<","$1    $2");
runner.addOperatorWithAlias("     ","<=","$1    $2");
runner.addOperatorWithAlias("  ",">","$1    $2");

List<String> errorInfo = new ArrayList<String>();
IExpressContext<String,Object> expressContext = new DefaultContext<String,Object>();
runner.execute(text , expressContext, errorInfo, true, false);
if(result){
	System.out.println("result is success!");
}else{
	System.out.println("result is fail!");
	for(String error : errorInfo){
		error=error.replaceAll(“  ”,"<").replaceAll(“     ”,"<=").replaceAll("  ",">");
		System.out.println(error);
	}
}

 

좋은 웹페이지 즐겨찾기