lex與yacc 二 計算器的實現

2021-09-26 02:38:29 字數 3138 閱讀 5372

2023年09月24日 18:44:24 ecbtnrt 閱讀數 4311

構建乙個c語言的編譯器並不是一件容易的事,我想每個人在學習編譯原理的時候並不會常見得它非常簡單.

下面將會學習編譯器的兩個重要組成部分:詞法分析器flex和語法分析器yacc

flex是gun實現的fast lex(lexical anslysis)

yacc實現有gun的bison和berkeley的byacc

flex與yacc程式是由下面三部分組成

%

%%標記這一部分結束

%%第二部分與第三部分分割

第一部分

定義段,拷貝到最終程式中的原始的c程式**,如標頭檔案.

第二部分

規則段,由兩部分組成:模式和動作,空白分開,記法分析程式識別出某個模式時,將執行相應的動作

模式為unix樣式的正規表示式

第三部分

使用者子程式段,合法c**組成.在lex生成**結束之後複製到c檔案.

calc.l

%

%%

([0-9]+|([0-9]*\.[0-9]+)([ee][-+]?[0-9]+)?)

[ \t] ; /* ignore white space */

[a-za-z][a-za-z0-9]*

"quot;

\n |

. return yytext[0];

%%

在編寫好規則後,呼叫yylex來根據進行規則詞法分析.

而這些規則是由正規表示式寫成的.

calc.y

%

%union

%token name

%token number

%left '-' '+'

%left '*' '/'

%nonassoc uminus

%type expression

%%

statement_list: statement '\n'

| statement_list statement '\n'

;

statement: name '=' expression

| expression

;

expression: expression '+' expression

| expression '-' expression

| expression '*' expression

| expression '/' expression

| '-' expression %prec uminus

| '(' expression ')'

| number

| name

| name '(' expression ')'

}

;

%%

/* look up a symbol table entry, add if not present */

struct symtab *

symlook(s)

char *s;

/* otherwise continue to next */

}

yyerror("too many symbols");

exit(1); /* cannot continue */

} /* symlook */

addfunc(name, func)

char *name;

double (*func)();

main()

lex將輸入流分成塊,然後yacc取得這些塊並將它們邏輯性地歸組到一起.

yacc語法分析器yyparse()重複嘗試分析句子直到輸入結束.

需要輸入時呼叫詞法分析程式yylex(),把匹配的標記返回給程式.要注意的是這裡的遞迴規則.

編譯:

lex calc.l

yacc -d calc.y

gcc y.tab.c lex.yy.c -ly -ll

語法分析程式分析過程移動與歸約

yacc語法分析程式是通過尋找可以匹配目前為止所看到的標記的規則來工作.yacc處理語法分析程式時建立了一組狀態,每個狀態反映乙個或多個部分地被分析的規則中的乙個可能位置.當語法分析程式讀取標記時,每次它讀取乙個沒完成規則的標記,就把它壓入內部堆疊中並切換到一種反映它剛剛讀取的標記的新狀態,這個動作稱為移進(shift).當它發現組成某條規則右側的全部符號時,它就把右側符號彈出堆疊,而將左側符號壓入堆疊中,並切換到反映堆疊上新符號的新狀態,這個動作被稱為歸約(reduction).因為它通常減少堆疊上專案的數目.無論yacc什麼時候歸約規則,它都執行與這條規則有關的使用者**.

lex與yacc 二 計算器的實現

2011年09月24日 18 44 24 ecbtnrt 閱讀數 4311 構建乙個c語言的編譯器並不是一件容易的事,我想每個人在學習編譯原理的時候並不會常見得它非常簡單.下面將會學習編譯器的兩個重要組成部分 詞法分析器flex和語法分析器yacc flex是gun實現的fast lex lexic...

lex與yacc 二 計算器的實現

2011年09月24日 18 44 24 ecbtnrt 閱讀數 4311 構建乙個c語言的編譯器並不是一件容易的事,我想每個人在學習編譯原理的時候並不會常見得它非常簡單.下面將會學習編譯器的兩個重要組成部分 詞法分析器flex和語法分析器yacc flex是gun實現的fast lex lexic...

簡易計算器(使用Lex和Yacc)

借助lex的詞法分析和yacc的語法分析,製作乙個簡易的計算器。詞法分析 mycalc.l return add return sub return mul return div n return cr return lb return rb 1 9 0 9 0 0 9 0 9 t lex myca...