계산기좀 도와주세요!
홀림길
질문 제목 : 계산기 인데 lex부분이랑 ** 이연산자를 넣어야하는데 잘모르겟네요 ㅠ
질문 내용 :
#include stdio.h
#include stdlib.h
#include string.h//true & false
#define false0
#define true1//tokenclass
#define plus0
#define minus1
#define multiple2
#define divide3
#define int_lit99//charclass & tokenclass
#define unknown-1
#define digit100
#define operator101
#define end102
#define lparen104
#define rparen105//최대 어휘 길이
#define max_lexeme_size100
//최대 식 길이
#define max_expression_size 100//main 함수원형
void menu();
void read(char []);
void display(int );//parser 함수원형
int calculator(char []);
int program();
int term();
int four();//lexer 함수원형
int getlexeme();
void addchar();
int isoper(char );
void getchar();
void getnonblank();
void getnonblankchar();
int lookup();
int lex();//parser 전역변수
charexpression[max_expression_size];
intexpressionindex;
intnexttoken;//lexer 전역변수
charlexeme[max_lexeme_size];
charnextchar;
intlexlen;
intcharclass;
charoplist[][3] = {+, -, *, /};/* main */
int main(void){
int result;
char exp[max_expression_size];
do{
menu();//계산기 메뉴 디스플레이
read(exp);//수식 읽기
result = calculator(exp);//입력된 수식을 계산하고, 그 결과값 result 반환
display(result);//결과값 result 출력
}while(true);return 0;
}/* 계산기 메뉴 디스플레이 */
void menu(){
puts(┌─────────────────────┐);
puts(│ 재귀 하강 파서를 이용한 수식 계산기 │);
puts(│ 수식을 입력하시오.(종료 : e) │);
puts(└─────────────────────┘);
}/* 수식 읽기 */
void read(char exp[]){
gets(exp);
if(strcmp(exp, e) == 0){
exit(0);
}
}/* 화면 출력 */
void display(int result){
puts(┌─────────────────────┐);
printf(│ 결과는 %10d입니다. │\n, result);
puts(└─────────────────────┘);
}/* 식을 전달받아 연산 후 결과를 반환 */
int calculator(char exp[]){
//초기화
int result;
strcpy(expression, exp);
nexttoken = lex();result = program();
expressionindex = 0;
return result;
}/* program - term { (+|-) term } */
int program(){
//좌값을 plusorminus를 호출하여 left에 저장
int left = term(), right;while(nexttoken == plus || nexttoken == minus){
int tmptoken = nexttoken;
nexttoken = lex();
right = term();
if(tmptoken == plus){
left += right;
}
else{
left -= right;
}
}return left;
}/* term - fact { (*|/) fact } */
int term(){
int left = fact(), right;while(nexttoken == multiple || nexttoken == divide){
int tmptoken = nexttoken;
nexttoken = lex();
right = fact();
if(tmptoken == multiple){
left *= right;
}
else{
left /= right;
}
}return left;
}/* fact - int_lit | (program) */
int fact(){
if (nexttoken == int_lit){
int value = getlexeme();
nexttoken = lex();return value;
}
else if (nexttoken == lparen){
int result;
nexttoken = lex();
);
result = program();
if (nexttoken == rparen)
{
nexttoken = lex();
}
else
{
printf(error - parenthesis is wrong);
exit(0);
}return result;
}
else
{
printf(error - expression is wrong);
exit(0);
}
}/* lexeme 접근자 */
int getlexeme()
{
return atoi(lexeme);
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |
2691618 | 링크드리스트 개념 질문이예요 (3) | 맨마루 | 2025-04-15 |