1

저는 개인 프로젝트로 포팅하는 게임을위한 스크립트 인터프리터를 만들고 있습니다. 이전에 몇 가지 질문을했습니다.스크립트 인터프리터에서 부울 표현식을 평가합니다.

꽤 잘 작동하기 시작했습니다.하지만 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과 같은 것을 사용하여 문법을 만드는 데 관심이 없습니다. 표현식 해석기로 "단순한"것으로 보이는 부분에 방해가되는 방식이 적어 야합니다.

+0

"표현식 해결사"는 구문 트리에서 예측됩니다. 구문 트리는 문법을 통해 문자열에서 파생되는 것이 가장 좋습니다. 문법을 사용하지 않는 것이 가장 힘든 해결책은 아닙니다. –

+0

@KirkWoll ANTLR과 같은 라이브러리를 사용할 필요없이 간단한 문법을 ​​구현할 수있는 방법을 알고 있다면 나는 그 가능성에 귀를 기울여야한다. –

+0

글쎄, 문법을 사용하려면 라이브러리를 사용해야하거나 직접 라이브러리를 작성해야합니다. 나는 과거에 [아이러니] (http://irony.codeplex.com/)를 사용해 효과를 보았으며, C#에서 빠져 나오지 않아도된다는 장점이 있습니다. (문법은 C# 자체로 정의됩니다.) –

답변

0

내 자신의 질문에 대답하기 위해서 : 나는 후위 계산기 접근법을 사용하여 끝내었다.

모든 토큰을 ExpressionSolver 클래스로 전달합니다.이 클래스를 중위어에서 Postfix로 변환 한 다음 Postfix를 평가합니다. 연산자 목록에는 &&|| 연산자가 포함되어 있으며 해당 연산자가 발생하면 이에 따라 처리합니다.

커크 울 (Kirk Woll)이 말한대로 입력을 토큰 화하기위한 간단한 Regex 기반 렉서를 만들었습니다. 실제로 더 쉽게 표현식을 풀기 전에 확실히 구문 분석을 수행했습니다. 다음 리소스를 사용했습니다. (내 의견도 참조하십시오.) Poor man's "lexer" for C#

관련 문제