2022년 4월 3일 일요일

[기록용] ( ) 등의 brace 가 포함된 문자열 논리식으로 분해하여 참, 거짓으로 가져오기 위한 class

 앞서 했던 모든 class를 활용하여 구문을 각 block 영역으로 재 구성하고 각각을 계산하여 

최종적인 참 거짓을 가져오기 위한 class 입니다. 


public class BraceSyntaxBaseDTO extends SyntaxBaseDTO {

private Map<String,SyntaxBaseDTO> braceDtoMap

= new LinkedHashMap<String,SyntaxBaseDTO>();;

public BraceSyntaxBaseDTO(String syntax) {

super(syntax);

initResource();

}

private void initResource() {

if ( CommonBaseUtility.isEmptyValue(syntax) ) {

return;

}

parseCurrentSyntaxValue();

}

@Override

public boolean parseCurrentSyntaxValue() {

// TODO Auto-generated method stub

this.setMainType(MAIN_TYPE.BRACE_TYPE);

if (CommonBaseUtility.isEmptyValue(syntax)) {

return false;

}

if ( isConstValue() ) {

return true;

}

specialKeySet = CommonParserUtility.parseSpecialKeyValues(syntax);

variableMap = CommonParserUtility.parseVariableValues(syntax);

if ( CommonParserUtility.hasBrasceValue(syntax) ) {

Map<String,String> braceMap = CommonParserUtility.parseStringBraceBlocks(syntax);

for ( String keyStr : braceMap.keySet() ) {

String v = braceMap.get(keyStr);

if ( CommonParserUtility.hasLogicalValue(v ) ) {

LogicSyntaxBaseDTO cDto = new LogicSyntaxBaseDTO(v);

braceDtoMap.put(keyStr, cDto);

} else if ( CommonParserUtility.hasCompareValue(v)) {

CompareSyntaxBaseDTO cDto = new CompareSyntaxBaseDTO(v);

braceDtoMap.put(keyStr, cDto);

} else if ( CommonParserUtility.hasCalculationValue(v)) {

CalculationSyntaxBaseDTO cDto = new CalculationSyntaxBaseDTO(v);

braceDtoMap.put(keyStr, cDto);

}

}

} else {

if ( CommonParserUtility.hasLogicalValue(syntax) ) {

braceDtoMap.put("FINAL", new LogicSyntaxBaseDTO(syntax));

} else if ( CommonParserUtility.hasCompareValue(syntax)) {

braceDtoMap.put("FINAL", new CompareSyntaxBaseDTO(syntax));

} else if ( CommonParserUtility.hasCalculationValue(syntax)) {

braceDtoMap.put("FINAL", new CalculationSyntaxBaseDTO(syntax));

}

}

return true;

}

@Override

public String getValue(Map<String, String> transMap) {

// TODO Auto-generated method stub

return null;

}


@Override

public boolean getLogicalValue(Map<String, String> transMap) {

// TODO Auto-generated method stub

if ( this.braceDtoMap == null || braceDtoMap.isEmpty() )

return false;

String finalKey = null;

for ( String s : braceDtoMap.keySet()) {

SyntaxBaseDTO dto = braceDtoMap.get(s);

if ( dto.getMainType() == MAIN_TYPE.CALCULATION_TYPE ) {

String v = dto.getValue(transMap);

transMap.put(s, v);

} else if ( dto.getMainType() == MAIN_TYPE.COMPARE_TYPE ) {

boolean v = dto.getLogicalValue(transMap);

transMap.put(s, v+"");

} else if ( dto.getMainType() == MAIN_TYPE.LOGIC_TYPE ) {

boolean v = dto.getLogicalValue(transMap);

transMap.put(s, v+"");

}

finalKey = s;

}

return braceDtoMap.get(finalKey).getLogicalValue(transMap);

}


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

String str = "(a+b > 29.9 && ( c < 10 or d >= 10) ) == false";

System.out.println ( String.format("Original Syntax : [%s]", str));

System.out.println ( String.format("Each varialbe value is assigned - [%s]", 10));

BraceSyntaxBaseDTO dto = new BraceSyntaxBaseDTO(str);

Map<String,Map<String,String>> variableMap = CommonParserUtility.parseVariableValues(str);

Map<String,String> transMap = new HashMap<String,String>();

for ( String s : variableMap.keySet()) {

transMap.put(s,"10");

}

System.out.println ( "FINAL RESULT : " + dto.getLogicalValue(transMap));

}

}

Main Block 에 보면 (a+b > 29.9 && ( c < 10 or d >= 10) ) == false 의 문자열이 있고, 

각 변수에 10을 할당하는 방법을 사용하였습니다. 

결국 (10+10 > 29.9 && (10 < 10 or 10 >= 10)) == false 의 구문으로 구성되고, 

( false && (true)) == false => false == false 가 되어 최종 결과는 true 입니다.

 




댓글 없음:

댓글 쓰기