問題描述:
編譯原理實驗要求構造語法分析程式,實現乙個簡單計算器的功能
實現功能:
1,基本運算
a) 加、減、乘、除
b) 乘方、開方
c) 位運算:與、或、非
d) 階乘運算
e) 三角函式運算
f) 可自定義變數並參與運算
2,輸出對應於輸入的字尾表示式(輸入的是中綴表示式)
3,列印語法分析器構造的語法樹
**:1,mycal.h
乙個簡單的單鏈表,用來儲存已經定義的變數
#ifndef mycal_h_included
#define mycal_h_included
#define null 0
#include typedef struct node
linklist;
linklist* initlist()
void destroylist(linklist* h)
free(h);
}void insertdata(linklist* h,double n,char *c,int l)
ah->next=(linklist*)malloc(sizeof(linklist));
ah->next->next=null;
ah->next->num=n;
ah->next->len=l;
int i=0;
ah->next->str=(char*)malloc(sizeof(char)*l);
while(inext->str[i]=c[i];
i++;
}}double getdata(linklist *h,double d)
return ah->data;
}void assigndata(linklist* h,double thedata,double exp)
ah->data = exp;
}double i***ist(linklist* h,char *c,int l)
if(strncmp(ah->str,c,l)==0)
return ah->num;
else
ah=ah->next;
}return 0;
}#endif // mycal_h_included
2,sqstack.h
乙個簡單的棧,用來列印語法分析器的推導序列
#ifndef sqstack_h_included
#define sqstack_h_included
typedef struct
sqstack;
sqstack* initstack()
sta->top=-1;
return sta;
}void push(sqstack* sta,char *a)
sta->s[sta->top][i]='\0';
}char* pop(sqstack* sta)
#endif // sqstack_h_included
3,mycal.lex
詞法分析程式,用來識別輸入並且返回給語法分析器
%
tri tan|sin|cos|sin|cos|tan
num [0-9]
number +(\.+)?(e([+-])?+)?
id [_a-za-z][_a-za-z0-9]*
op [\+\-\*\/\|\&\~\^\!\(\)\=]
space [\ \t]+
%% ;
sqrt|sqrt
if(yytext[0]=='c'&&yytext[1]=='o'&&yytext[2]=='s' || yytext[0]=='c'&&yytext[1]=='o'&&yytext[2]=='s')
if(yytext[0]=='t'&&yytext[1]=='a'&&yytext[2]=='n' || yytext[0]=='t'&&yytext[1]=='a'&&yytext[2]=='n') }
else }
|\n
. printf("find error\n");
%%int yywrap(void)
4,mycal.y
語法分析程式,實現要求的功能
%token num var sqrt tri
%left '&' '|'
%left '+' '-'
%left '*' '/'
%right '~'
%right '!' '^'%%%
start:
start stat '\n' }|
;stat:
var '=' exp
|exp
;exp:
num
|var
|exp '+' exp
|exp '-' exp
|exp '*' exp
|exp '/' exp
|exp '&' exp
|exp '|' exp
|'~' exp
|exp '!'
|exp '^' exp
|sqrt '(' exp ')'
|tri '(' exp ')'
case 1:
case 2:
}}|'(' exp ')' ;%%
#include "lex.yy.c"
int main(void)
void yyerror(char* s){}
double factorial(double d)
return sum;
}
執行結果:
小結:剛開學比較新鮮,也比較喜歡孔繁茹老師,寫程式時用心了
在中間的時候,應用了lex幫我處理了乙個問題,學以致用
感覺資料結構和編譯原理很重要,學吧
前端編譯原理 筆記 BISON
bsion文件,下面是中文的位址 上面的是左遞迴,下面的是右遞迴,推薦的是盡量左遞迴的寫法 使用 left,right或者 nonassoc 可以一次宣告乙個記號並指明它的優先順序和結合性.這些被稱做優先順序宣告 precedence declarations 解決中衝突的方法是比較正在考慮的規則和...
編譯原理之 Bison 原始檔結構原理
0x01 參考 我們需要按照bison的要求,書寫bison的源程式 gramma.y 然後由bison把它翻譯為c檔案。因此,bison是編譯程式的翻譯器。bison的原始檔通常由八個部分組成 一.自由定義部分 這部分被bison原封不動地複製到輸出的.c檔案中。二 語法棧的聯合 union 結構...
編譯原理 Lex和Bison實現計算器
實現以下步驟,掌握 flex 和 bison 的工作過程 a 在 dos 命令提示符下依次執行以下兩行命令 flex calc.lex bison ocalc.c calc.y b 編譯執行 calc.c 編譯執行完後 題目要求 用 flex 和 bison 實現乙個功能更為強大的計算器,包含以下運...