저는 개인 프로젝트로 포팅하는 게임을위한 스크립트 인터프리터를 만들고 있습니다. 이전에 몇 가지 질문을했습니다.스크립트 인터프리터에서 부울 표현식을 평가합니다.
꽤 잘 작동하기 시작했습니다.하지만 while 루프, if 문, etcetera와 같은 부울 표현식을 평가해야하는 시점에 왔습니다.
현재 코드가 스크립트를 토큰 화하고 부울 식을 만날 때 ProcessExpression(string[] tokens)
이라는 함수에 전달합니다. 예 토큰 배열 될 수있다 : 실제 평가를 해결하는 방법에 대해 생각
local.i
<=
local.arrayLength
+
1
&&
(
local.i
<
local.notThis
||
local.i
>
local.notThis
)
가, 내가 예를 들어, 실제 값으로 변수를 대체하여 시작 거라고 생각 : local.i
가 0이 될 것이다 local.arrayLength
16 될 것 그리고 local.notThis
은 10이됩니다.
그런 다음 포스트 픽스 계산기를 통해 결과 토큰을 가져 와서 논리적 조건 만 남겨두고 모든 수학을 없애려했습니다.
그러나 이것이 취해야 할 접근 방식이라면 나는 담장 위에 있습니다. 후위 계산만으로 많은 코드가 추가되는 것을 보았을 때, 내가 생각하지 못한 트릭이 있는지 궁금해하고 있었습니까? 후위 접미사가 실제로 갈 길이라면 수학 연산자와 함께 논리적 조건을 어떻게 든 처리 할 수 있습니까?
저는 이것을 C#에서 만들었지 만, 외부 라이브러리 나 일종의 "Eval"-function을 사용하기를 꺼려합니다. 또한 ANTLR과 같은 것을 사용하여 문법을 만드는 데 관심이 없습니다. 표현식 해석기로 "단순한"것으로 보이는 부분에 방해가되는 방식이 적어 야합니다.
"표현식 해결사"는 구문 트리에서 예측됩니다. 구문 트리는 문법을 통해 문자열에서 파생되는 것이 가장 좋습니다. 문법을 사용하지 않는 것이 가장 힘든 해결책은 아닙니다. –
@KirkWoll ANTLR과 같은 라이브러리를 사용할 필요없이 간단한 문법을 구현할 수있는 방법을 알고 있다면 나는 그 가능성에 귀를 기울여야한다. –
글쎄, 문법을 사용하려면 라이브러리를 사용해야하거나 직접 라이브러리를 작성해야합니다. 나는 과거에 [아이러니] (http://irony.codeplex.com/)를 사용해 효과를 보았으며, C#에서 빠져 나오지 않아도된다는 장점이 있습니다. (문법은 C# 자체로 정의됩니다.) –