2010-06-16 4 views
4

시스템에는 (A+B)*C과 같은 표현식을 작성해야하는 표기법이 있으며 #MUL(#ADD(A,B),C)입니다. 사용자가보다 일반적인 방식으로 입력 할 수 있도록 이러한 종류의 표기법 변환을 수행하는 알고리즘이 이미 있습니까? 즉, infix -> my 표기법을 변환하는 알고리즘입니다. 첫 번째 문제는 제 표기법에 대한 정확한 이름을 모르겠다는 것입니다 ... 역 분개와 유사하지만 상당히 아닙니다. 모든 연산자는 인수를 취하는 함수로 인코딩됩니다.이 표기법 변환/변환을위한 기존 알고리즘이 있습니까?

+2

나는 "접두어 표기법"이라고 부릅니다. 왜냐하면 연산자가 중간 (중위)이 아닌 피연산자 목록의 시작 부분에 있기 때문입니다. – FrustratedWithFormsDesigner

+3

이것은 Jan Łukasiewicz의 이름을 따서 명명 된 폴란드 표기법입니다. 역 폴란드 표기법과 비슷합니다 ... 역방향;) –

+2

둘 다 호출됩니다. –

답변

9

Shunting-yard algorithm은 중절 표기법을 구문 분석하는 데 사용할 수 있습니다.

+0

10 초까지 나를 때려 눕히십시오. – Randy

+0

+1. 나는 SY를 보았지만 비슷한 출력 표기법이 아니므로 다른 알고리즘이 더 가까운 성냥인지 궁금해했다. 이것은 기존의 알고리즘에 대한 사소한 수정입니까? –

+1

Shunting 야드는 추상 구문 트리를 출력 할 수 있습니다. AST가 있으면 사전 예약을 통해 폴란드 표기법을 사용할 수 있습니다. –

0

Lex와 Yacc (Flex와 Bison의 경우 동일 함)를 사용하여 이러한 간단한 표현식을 쉽게 파싱 할 수 있습니다. "Yacc 계산기"에 대한 Google.

내가 찾은 한 예가 http://www.indiastudychannel.com/resources/56696-IMPLEMENTATION-OF-CALCULATOR-USING-YACC.aspx이지만 결과를 계산하는 대신 최종 문자열을 작성해야합니다. 예를 들어, 다음과 같이 (의사 코드) :

expr: ‘(‘expr’)’ 
{ 
$$=$2; 
} 
| 
expr ‘*’expr 
{ 
$$="#MUL(" + S1 + "," + $3 + ")"; 
} 
| 
expr’/’expr 
{ 
$$="#DIV(" + S1 + "," + $3 + ")"; 
} 
+0

모두 좋고 좋지만이 코드를 코드에 넣고 싶습니다. 사용 가능한 경우에도 실제로 라이브러리에 대한 전체 종속성을 추가하고 싶지는 않습니다. –

+0

Lex와 Yacc는 표준 C 라이브러리 만 필요하다고 생각합니다. 내 응용 프로그램에서 복잡한 파일을 구문 분석하고 Lex 및 Yacc을 실행하면 내 빌드 프로세스의 일부로 사용됩니다. 귀하의 경우, Lex 및 Yacc를 로컬로 실행하고 프로젝트에서 생성 된 .H 및 .C 파일을 사용할 수 있습니다. 결국 Lex와 Yacc는 언어 설명을 처리하고 오히려 표준 .H 및 .C 파일을 생성합니다. 내가 생각하기에는이게 문제가 아니야. – Patrick