파서 트리
파싱을 목적으로 하는 트리
파싱
원본을 목적에 맞게 변환하는 작업
A포맷으로 되어 있는 원본을 B포맷으로 변환하는 작업
예) 수식 파서 트리(피 연산자는 음이 아닌 정수, 연산자는 사칙연산에 한한다고 하자.)
먼저 중위 표기에 해당하는 정규식을 만들어보자.
Numeric Expression!: <operand><mid - expression!>0
mid -expression!: <operator><operand>
operator: <+>|<->|<*>|</>
operand: <number_char>*
number_char:<0>|<1>|...|<9>
위 첨자가 작성이 안되어서 다음과 같이 약속한다.
참고 <a>* : a가 1번 이상 반복된다.
<a>0 : a가 0번 이상 반복된다.
수식 파서 트리를 만들기 위해서
1. 원본을 입력받는다.
2. 토큰을 생성한다.(Lexical) :잘못된 토큰이 있으면 멈춤다.
==> 원본에 모든 요소가 operand 혹은 operator로 구분할 수 있는지 판단하여 구분한다.
3. 문법을 체크한다.(Syntax): 문법과 다른 형태로 토큰이 나열되어 있으면 멈춘다.
==> 토큰 배열의 요소가 Numeric Expression! 문법에 맞는지 확인하다.
4.후위 운행한다.
예제 코드
#include <stdlib.h> #define MAX_BUFSIZE 100 struct _PLEAF struct _PARSER //파서 트리
parser *ps; //파서 트리를 보관할 변수 int fnAdd(int a,int b) int (*FArr[4])(int,int)={fnAdd,fnSub,fnMul,fnDiv};
parser *NewParser(size_t max_token)
void KillParser(parser *in)
int IsOperator(char expr) //연산자인지 확인
int Lexical(char *expr,parser *in) //입력 버퍼를 수식에 사용되는 토큰들로 이루어졌는지 확인하며 토큰 테이블을 구성
int Syntax(parser *in)
void HangOperand(pleaf *inleaf,parser *inp) //피 연산자를 파서트리에 매단다
if(((t=='*')||(t=='/')) && ((r== '+')||(r=='-'))) //새로 들어온 연산자가 root의 연산자보다 우선순위가 높을 때
base = in->tokentable; for(base++,cnt = 1;cnt<in->tcnt;base++,cnt=cnt+2) base++; t = NewLeaf(*base);
int CalAll(pleaf *in) //파서 트리를 후위 순회하면서 계산하면 결과가 나옮
int CalCul(parser *in)
void GetStr(char *in,size_t size) }
}
void main() |
'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글
[C언어 소스] 산봉우리 출력 (0) | 2016.04.03 |
---|---|
[C언어 소스] 다이아몬드 출력 (0) | 2016.04.03 |
[C언어 소스] 역삼각형 출력 (0) | 2016.04.03 |
[C언어 소스] 삼각형 출력 - 반복문 연습 (0) | 2016.04.03 |
[C언어 소스] 정사각형 출력 - 반복문 연습 (0) | 2016.04.03 |
큰 수의 덧셈, 곱셈 (0) | 2009.08.19 |
적분 공식을 이용하여 파이 구하기 (0) | 2009.08.19 |
Visual C++ 표준 라이브러리 헤더파일 (0) | 2009.08.19 |
singed 와 unsigned (1) | 2009.08.19 |
16진수와 2진수 사이의 변환 (0) | 2009.08.19 |