編譯原理 用Bison構造語法分析程式 小小計算器

2021-07-11 05:46:12 字數 3097 閱讀 6933

問題描述:

編譯原理實驗要求構造語法分析程式,實現乙個簡單計算器的功能

實現功能:

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 實現乙個功能更為強大的計算器,包含以下運...