2011-01-14 2 views
1

I 수식이있는 경우 :수식을 구문 분석하여 C#에서 트리를 작성하는 방법은 무엇입니까?

내가 노드 트리로 공식을 구축 할 수있는 방법을
A = 2+3*5-6/3+2 

, 나는 쉽게 왼쪽에서 오른쪽으로 상향식 (bottom-up)에서 트리를 기반으로 결과를 산출 할 수 있습니다.

누군가 필요한 파서 또는 일부 참조 견본을 제공해 주시겠습니까?

+0

몇 가지 세부 사항을 추가 할 수 있습니까? 수식에 괄호를 쓸 수 있습니까? 뺄셈, 곱셈 및 나눗셈은 유일한 연산입니까? – vlad

+1

[이 질문] (http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence)은 C#과 관련이 없지만 매우 유사합니다. 시작하는 데 도움이 될 수 있습니다. –

+2

이것은 내게 숙제로 들립니다. 전혀 시도한 적이 있습니까? –

답변

3

구문 분석에 대한 여러 가지 전략이있다.

구문 분석 코드를 직접 작성하려면 Recursive descent parser을 사용하는 것이 좋습니다. 이것은 C# 언어에 대해 저 자신의 것을 썼기 때문에 그렇게하기가 어렵지 않습니다.

파서 생성기 도구를 사용하려는 경우 기존 GNU flex/bison 조합을 사용하거나 "C# 파서 생성기"에 대해 google을 사용하여 C#을 찾으면 C로 작성할 필요가 없습니다. 그러면 LALR parser이 생성됩니다.

2

단지 산술 인 경우 you can leverage javascript within C# to "eval" the string입니다. 적절한 파서를 작성하려면 문법을 작성하고 해당 문법에서 파서를 생성 한 다음 해석기를 작성하여 파서의 출력을 처리해야합니다. GOLD Parsing System은 해당 작업에 매우 유용하며 .NET engines, including C#입니다. 다른 옵션으로는 ANTLR Parser GeneratorLEX and YACC이 있습니다.

자신 만의 롤을 만들고 싶다면 많은 리소스가 있습니다. 골드 구문 분석 시스템 페이지는 실제로 이미 그것에 대해 많은 정보를 가지고 :

등은

2

단순한 수학적 표현이면 역방향 폴란드어 표기법으로 변환하는 것이 하나의 방법입니다. 이 표기법에서는 표현이 트리를 "선형화"(스택으로)하기 때문에 표현식을 계산하는 것이 매우 쉽습니다. 그런 다음 RPN 표기법으로 구문 분석하고 변환하는 실제 작업 (실제로는 매우 쉽습니다).

[http://en.wikipedia.org/wiki/Reverse_Polish_notation#Example]

은 계산하기가 훨씬 쉬웠다 때문에 RPN을 사용하는 데 사용되는 아주 오래된 계산기.