表示式翻譯器-1-編譯原理
阿新 • • 發佈:2019-02-08
#include <stdio.h> #include <stdlib.h> #define NUM_TKN 500 #define ID_TKN 600 #define NONE NULL char LookAhead; int LookAhead1; char lexeme[1024]; int lineno = 1,temp=0, tokenval = 0; int isdigit(int t) { if(t>='0'&&t<='9') return 1; else return 0; } int ischar(intt) { if(t>='A'&&t<='z') return 1; else return 0; } int Match1() { int t, i; while (1) { t = getchar(); if (t == ' ' || t == '\t') ; else if (t == '\n') lineno++; else if (isdigit(t)) { tokenval=0; while (isdigit(t)) { tokenval = tokenval * 10 + t - '0'; t = getchar(); } ungetc(t, stdin); //return tokenval; LookAhead1=tokenval; return NUM_TKN; }else if( ischar(t) ) { i=0; do { lexeme[i++]=t; t = getchar(); }while( ischar(t) || isdigit(t) ); lexeme[i]='\0'; ungetc(t, stdin); return ID_TKN; } else { tokenval = NONE; return t;//例如t='+',則把'+'的ASCII作為'+'的TokenName。 } } } void Match(char t) { //if( LookAhead==t ) LookAhead = getchar(); //繼續往前看後一個字元 /* else { printf("\n表示式錯誤:Match函式中需要輸入的字元為%c,但是實際輸入的是%c\n", t, LookAhead ); exit(1); //結束程式 }*/ } void Expr(); void Factor() { if(LookAhead=='(') { Match('('); Expr(); Match(')'); } if(temp==500) printf("%d ",LookAhead1); else if(temp==600) { char *p; p = lexeme; printf("%s ",p); } Match(LookAhead); /*if(LookAhead>='a' && LookAhead<='z') { printf("%c",LookAhead); Match(LookAhead); } if(LookAhead>='0' && LookAhead<='9') { printf("%c",LookAhead); Match(LookAhead); }*/ } void Morefactors(); void Term() { Factor(); Morefactors(); } void Morefactors() { switch( LookAhead ) { case '*': temp= Match1(); Factor(); putchar('*'); Morefactors(); // rest --> + term {print('+')} rest break; case '/': temp= Match1(); Factor(); putchar('/'); Morefactors(); // rest --> - term {print('-')} rest break; default: // rest --> 空 break; } } void Moreterms() { switch( LookAhead ) { case '+': temp= Match1(); Term(); putchar('+'); Moreterms(); // rest --> + term {print('+')} rest break; case '-': temp= Match1(); Term(); putchar('-'); Moreterms(); // rest --> - term {print('-')} rest break; default: // rest --> 空 break; } } void Expr() { Term(); Moreterms(); } void main() { printf("請輸入中綴表示式:"); temp= Match1(); // printf("其後綴表示式為:"); Expr(); /* if( LookAhead !='\n' ) { //例如:3+45 printf("\n輸入的表示式錯誤,錯誤的字元:%c\n", LookAhead); exit(1); } */ printf("\n表示式分析成功!\n"); }