현재 다음을 기반으로 식 평가 기 (수식과 같은 단일 줄 식)를 구현하고 있습니다.
- 입력 된 표현식은 리터럴 부울, 정수, 소수, 문자열, 함수, 식별자 (변수)를 구분하기 위해 토큰 화됩니다.
- 나는 괄호를 없애고 접미사 순서로 적절한 우선 순위를 가진 연산자를 정렬하기 위해 Shunting-yard 알고리즘 (가변 수의 인수로 함수를 처리하도록 약간 수정 됨)을 구현했습니다.
- 내 션트 야드는 단순히 (시뮬레이션 된) 토큰 대기열을 생성합니다 (배열을 통해 Powerbuilder Classic 언어는 객체를 정의 할 수 있지만 동적 배열 만 기본 스토리지-실제 목록이 아니라 사전이 아님). 간단한 스택 머신
평가자가 훌륭하게 작동하고 있지만 여전히 누락되어 if()
있으며 진행 방법이 궁금합니다.
션트 야드 postfixed 및 스택 기반 평가에서 if()
true 및 false 부분을 가진 다른 함수로 추가 하면 하나의 if(true, msgbox("ok"), msgbox("not ok"))
메시지 만 표시하면서 하나의 메시지 만 표시합니다. 함수를 평가해야 할 때 모든 인수가 이미 평가되어 스택에 배치 되었기 때문입니다.
if()
게으른 방식으로 구현하는 방법을 알려주시겠습니까 ?
나는 이것을 일종의 매크로로 처리하는 것에 대해하지만 초기에는 아직 상태 평가를하지 못했습니다. 아마도 조건과 true / false 표현식을 별도로 유지하려면 대기열 이외의 다른 종류의 구조를 사용해야합니까? 지금은 표현식이 평가 전에 파싱되지만 나중에 중간 평가를 미리 평가할 수있는 사전 컴파일 된 표현식으로 저장할 계획입니다.
편집 : 문제에 대한 몇 가지 후에, 나는 내 표현의 트리 표현을 만들 수 있다고 생각합니다 (선형 토큰 스트림 대신 AST) if()
. 내에서 하나 또는 다른 분기를 쉽게 무시할 수 있습니다 .