2009-05-05 8 views
3

((VariableA -> VariableB) AND NOT VariableC) 구문에 대한 논리 표현 파서를 작성하려고합니다. 파서는 결과에 대해 true 또는 false를 반환 할 수 있어야합니다 변수의 값.논리 표현 파서

기본적으로 표현식에는 변수, 논리 연산자 (또는, 및 함축, 등가성, 부정 및 괄호) 만 포함됩니다.

AST 트리 또는 역방향 폴란드어 표기법을 사용하는 이런 종류의 구문 분석기를 구현하는 가장 좋은 방법은 무엇입니까? 아니면 이미 작업을 수행 할 수있는 오픈 소스 파서가 이미 존재합니까?

+0

재귀 적 하향 파서를 구현합니다. 논리 표현식은 매우 간단하며 쉽게 파싱 할 수 있습니다. 파싱 ​​동작은 스택에서 푸시/팝 중간 값을 변수로 평가할 수 있습니다. 이것은 ~~ 50 행의 C 코드 여야합니다. –

답변

1

내가 너라면 RPN을 사용합니다. 파싱 ​​할 때 슬픔을 덜어 주어야하며 알고리즘은 연산자가 들어올 때 스택 값을 누를 때마다 푸시하고 팝핑하는 것처럼 간단해야합니다. 괄호를 바보로 만들지 않아도되므로 삶이 더 쉬워집니다. 유일한 단점은 대부분의 사람들은 후위 (RPN) 표기법에 익숙하지 않다는 것입니다.

스택은 트리보다 더 쉽게 작업 할 수 있습니다.

그냥 내 2 ¢ :

2

어떤 언어로 타겟팅하고 있습니까?

파서를 만들고 싶다면 ANTLR이 당신을 대신 할 것입니다. 그것은 원래 자바 기반이지만 다양한 언어 (예를 들어 C# 파서를 생성하는 데 사용)에 대한 생성기가 있으며 픽업하기가 너무 어렵지 않습니다. 멋진 편집기 인 문법 검사를 할 수있는 좋은 편집기 (ANTLRWorks)가 있습니다.

0

이미이 도구 (논리 평가)가 있지만 도구를 찾을 수 없습니다. Bison (YACC, C) 또는 ANTLR (많은 언어를 생성하지만 Java를 사용)과 같은 도구를 사용하면 파싱에 대해 크게 걱정할 필요가 없습니다. Coco/R은 많은 다른 언어를 생성 할 수있는 또 다른 파서 생성기입니다. 그래도 직접하고 싶다면 RPN 또는 접두사 표기법을 사용합니다 (RPN보다 간단합니다). 이렇게하면 구문 분석이 훨씬 쉬워 지지만 사용자를 괴롭 히게됩니다.

0

그것은 당신이 재귀 적 언어를 정의 할 필요가

먼저 :-) 숙제처럼 들린다.

변수가 잘 형성되는 형태 (WFF)

X는 X와 Y가 다음 (X -> Y) WFF을하는 경우 WFF 후하지 X는 WFF

인 경우이다 WFF

X와 Y는 다음 WFF을하는 경우 (X와 Y가)는 WFF

문법이 정의되면 사용 LEX 또는 Flex 또는 Java 또는 사소한 스캐너를 작성하기위한 당신의 선호하는 언어에 해당하는.

자손 재귀 파서 작성시 YACC 또는 Bison 또는 이와 동등한 것을 사용하십시오.

나중에 애트리뷰트를 문법에 추가하여 재귀 적 재귀 방식으로 평가하려는 표현식의 평가를 얻습니다.

+0

Yacc과 Bison은 재귀 - 하강 파서를 만들지 않고 표 구동 시프트 - 감소 (즉, 상향식) 파서를 만듭니다. – ackb

+0

사실! touchee. 잠시 동안 나는 lex와 yacc을 사용하지 않습니다. – Luixv

0

http://ncalc.codeplex.com을 보았습니까?

확장 성이 뛰어나며 (예 : 자체 캐시가 있음) EvaluateFunction/EvaluateParameter 이벤트를 처리하여 런타임에 사용자 지정 함수와 변수를 제공 할 수 있습니다. 구문 분석 할 수있는 표현식 예제 :

표현식 e = new 표현식 ("Round (Pow (Pi, 2) + Pow ([Pi2], 2) + X, 2)");

e.Parameters [ "Pi2"] = new Expression ("Pi * Pi"); e.Parameters [ "X"] = 10; e.EvaluateParameter + = 대리자

(문자열 이름 ParameterArgs에 args) { (이름 == "파이") args.Result = 3.14의 경우; };

Debug.Assert (117.07 == e.Evaluate()); 또한 유니 코드 & 기본적으로 많은 데이터 형식을 처리합니다. 문법을 바꾸려면 antler file이 함께 제공됩니다. 또한 새로운 기능을로드하기 위해 MEF를 지원하는 포크가 있습니다.