A. 編譯原理試題·
Lex和Yacc應用方法(一).初識Lex
草木瓜 20070301
Lex(Lexical Analyzar 詞法分析生成器),Yacc(Yet Another Compiler Compiler
編譯器代碼生成器)是Unix下十分重要的詞法分析,語法分析的工具。經常用於語言分
析,公式編譯等廣泛領域。遺憾的是網上中文資料介紹不是過於簡單,就是跳躍太大,
入門參考意義並不大。本文通過循序漸進的例子,從0開始了解掌握Lex和Yacc的用法。
一.Lex(Lexical Analyzar) 初步示例
先看簡單的例子(註:本文所有實例皆在RetHat linux下完成):
一個簡單的Lex文件 exfirst.l 內容:
%{
#include "stdio.h"
%}
%%
[\n] ;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在命令行下執行命令flex解析,會自動生成lex.yy.c文件:
[root@localhost liweitest]flex exfirst.l
進行編譯生成parser可執行程序:
[root@localhost liweitest]cc -o parser lex.yy.c -ll
[注意:如果不加-ll鏈結選項,cc編譯時會出現以下錯誤,後面會進一步說明。]
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:77: undefined reference to `main'
/tmp/cciACkbX.o(.text+0x37b): In function `yylex':
: undefined reference to `yywrap'
/tmp/cciACkbX.o(.text+0xabd): In function `input':
: undefined reference to `yywrap'
collect2: ld returned 1 exit status
創建待解析的文件 file.txt:
title
i=1+3.9;
a3=909/6
bcd=4%9-333
通過已生成的可執行程序,進行文件解析。
[root@localhost liweitest]# ./parser < file.txt
Var : title
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
到此Lex用法會有個直觀的了解:
1.定義Lex描述文件
2.通過lex,flex工具解析成lex.yy.c文件
3.使用cc編譯lex.yy.c生成可執行程序
再來看一個比較完整的Lex描述文件 exsec.l :
%{
#include "stdio.h"
int linenum;
%}
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 進行分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
進行解析編譯:
[root@localhost liweitest]flex exsec.l
[root@localhost liweitest]cc -o parser lex.yy.c
[root@localhost liweitest]./parser < file.txt
----- Lex Example -----
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
Line Count: 4
這里就沒有加-ll選項,但是可以編譯通過。下面開始著重整理下Lex描述文件.l。
二.Lex(Lexical Analyzar) 描述文件的結構介紹
Lex工具是一種詞法分析程序生成器,它可以根據詞法規則說明書的要求來生成單詞識
別程序,由該程序識別出輸入文本中的各個單詞。一般可以分為<定義部分><規則部
分><用戶子程序部分>。其中規則部分是必須的,定義和用戶子程序部分是任選的。
(1)定義部分
定義部分起始於 %{ 符號,終止於 %} 符號,其間可以是包括include語句、聲明語句
在內的C語句。這部分跟普通C程序開頭沒什麼區別。
%{
#include "stdio.h"
int linenum;
%}
(2) 規則部分
規則部分起始於"%%"符號,終止於"%%"符號,其間則是詞法規則。詞法規則由模式和
動作兩部分組成。模式部分可以由任意的正則表達式組成,動作部分是由C語言語句組
成,這些語句用來對所匹配的模式進行相應處理。需要注意的是,lex將識別出來的單
詞存放在yytext[]字元數據中,因此該數組的內容就代表了所識別出來的單詞的內容。
類似yytext這些預定義的變數函數會隨著後面內容展開一一介紹。動作部分如果有多
行執行語句,也可以用{}括起來。
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
A.規則部分的正則表達式
規則部分是Lex描述文件中最為復雜的一部分,下面列出一些模式部分的正則表達式字
符含義:
A-Z, 0-9, a-z 構成模式部分的字元和數字。
- 指定范圍。例如:a-z 指從 a 到 z 之間的所有字元。
\ 轉義元字元。用來覆蓋字元在此表達式中定義的特殊意義,
只取字元的本身。
[] 表示一個字元集合。匹配括弧內的任意字元。如果第一個字
符是^那麼它表示否定模式。例如: [abC] 匹配 a, b, 和C
的任何一個。
^ 表示否定。
* 匹配0個或者多個上述模式。
+ 匹配1個或者多個上述模式。
? 匹配0個或1個上述模式。
$ 作為模式的最後一個字元時匹配一行的結尾。
{ } 表示一個模式可能出現的次數。 例如: A{1,3} 表示 A 可
能出現1次或3次。[a-z]{5} 表示長度為5的,由a-z組成的
字元。此外,還可以表示預定義的變數。
. 匹配任意字元,除了 \n。
( ) 將一系列常規表達式分組。如:{Letter}({Letter}|{Digit})*
| 表達式間的邏輯或。
"一些符號" 字元的字面含義。元字元具有。如:"*" 相當於 [\*]。
/ 向前匹配。如果在匹配的模式中的"/"後跟有後續表達式,
只匹配模版中"/"前面的部分。如:模式為 ABC/D 輸入 ABCD,
時ABC會匹配ABC/D,而D會匹配相應的模式。輸入ABCE的話,
ABCE就不會去匹配ABC/D。
B.規則部分的優先順序
規則部分具有優先順序的概念,先舉個簡單的例子:
%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
%%
此時,如果輸入內容:
[root@localhost liweitest]# cat file1.txt
AAAAAAA
[root@localhost liweitest]# ./parser < file1.txt
THREE
TWO
ONE
Lex分析詞法時,是逐個字元進行讀取,自上而下進行規則匹配的,讀取到第一個A字元
時,遍歷後發現三個規則皆匹配成功,Lex會繼續分析下去,讀至第五個字元時,發現
"AAAA"只有一個規則可用,即按行為進行處理,以此類推。可見Lex會選擇最長的字元
匹配規則。
如果將規則
AAAA {printf("THREE\n");};
改為
AAAAA {printf("THREE\n");};
./parser < file1.txt 輸出結果為:
THREE
TWO
再來一個特殊的例子:
%%
title showtitle();
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
%%
並輸入title,Lex解析完後發現,仍然存在兩個規則,這時Lex只會選擇第一個規則,下面
的則被忽略的。這里就體現了Lex的順序優先順序。把這個例子稍微改一下:
%%
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
title showtitle();
%%
Lex編譯時會提示:warning, rule cannot be matched.這時處理title字元時,匹配
到第一個規則後,第二個規則就無效了。
再把剛才第一個例子修改下,加深下印象!
%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
AAAA {printf("Cannot be executed!");};
./parser < file1.txt 顯示效果是一樣的,最後一項規則肯定是會忽略掉的。
C.規則部分的使用變數
且看下面示例:
%{
#include "stdio.h"
int linenum;
%}
int [0-9]+
float [0-9]*\.[0-9]+
%%
{int} printf("Int : %s\n",yytext);
{float} printf("Float : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在%}和%%之間,加入了一些類似變數的東西,注意是沒有;的,這表示int,float分
別代指特定的含義,在兩個%%之間,可以通過{int}{float}進行直接引用,簡化模
式定義。
(3) 用戶子程序部分
最後一個%%後面的內容是用戶子程序部分,可以包含用C語言編寫的子程序,而這些子
程序可以用在前面的動作中,這樣就可以達到簡化編程的目的。這里需要注意的是,
當編譯時不帶-ll選項時,是必須加入main函數和yywrap(yywrap將下後面說明)。如:
...
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 進行Lex分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
三.Lex(Lexical Analyzar) 一些的內部變數和函數
內部預定義變數:
yytext char * 當前匹配的字元串
yyleng int 當前匹配的字元串長度
yyin FILE * lex當前的解析文件,默認為標准輸出
yyout FILE * lex解析後的輸出文件,默認為標准輸入
yylineno int 當前的行數信息
內部預定義宏:
ECHO #define ECHO fwrite(yytext, yyleng, 1, yyout) 也是未匹配字元的
默認動作
內部預定義的函數:
int yylex(void) 調用Lex進行詞法分析
int yywrap(void) 在文件(或輸入)的末尾調用。如果函數的返回值是1,就停止解
析。 因此它可以用來解析多個文件。代碼可以寫在第三段,這
樣可以解析多個文件。 方法是使用 yyin 文件指針指向不同的
文件,直到所有的文件都被解析。最後,yywrap() 可以返回1
來表示解析的結束。
lex和flex都是解析Lex文件的工具,用法相近,flex意為fast lexical analyzer generator。
可以看成lex的升級版本。
相關更多內容就需要參考flex的man手冊了,十分詳盡。
四.關於Lex的一些綜述
Lex其實就是詞法分析器,通過配置文件*.l,依據正則表達式逐字元去順序解析文件,
並動態更新內存的數據解析狀態。不過Lex只有狀態和狀態轉換能力。因為它沒有堆棧,
它不適合用於剖析外殼結構。而yacc增加了一個堆棧,並且能夠輕易處理像括弧這樣的
結構。Lex善長於模式匹配,如果有更多的運算要求就需要yacc了。
B. c(a/g/w)ll選擇哪個
熱門頻道
首頁
博客
研修院
VIP
APP
問答
下載
社區
推薦頻道
活動
招聘
專題
打開CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打開APP
c語言lr文法還是ll文法,編譯原理復習題 轉載
2021-05-20 05:05:24
Tim Pan
碼齡4年
關注
一、單項選擇題 概述部分
1.構造編譯程序應掌握 。D A. 源程序 B. 目標語言 C. 編譯方法 D. 以上三項都是 2.編譯程序絕大多數時間花在 上。D
A. 出錯處理
B. 詞法分析
C. 目標代碼生成
D. 表格管理 3.編譯程序是對 。D
A. 匯編程序的翻譯
B. 高級語言程序的解釋執行
C. 機器語言的執行
D. 高級語言的翻譯 4. 將編譯程序分成若干「遍」,是為了 。B
A. 提高程序的執行效率
B. 使程序的結構更為清晰 C 利用有限的機器內存並提高機器的執行效率 D. 利用有限的機器內存但降低了機器的執行效率
詞法分析部分
1.DFA M(見圖1-1)接受的字集為 。D A. 以0開頭的二進制數組成的集合
B. 以0結尾的二進制數組成的集合
.png
C. 含奇數個0的二進制數組成的集合
D. 含偶數個0的二進制數組成的集合
2.詞法分析器的輸出結果是 。C
A. 單詞的種別編碼
B. 單詞在符號表中的位置
C. 單詞的種別編碼和自身值
D. 單詞自身值 3.正規式M1和M2等價是指 。C A. M1和M2的狀態數相等 B. M1和M2的有向邊條數相等 C. M1和M2所識別的語言集相等 D. M1和M2狀態數和有向邊條數相等 4.詞法分析器的加工對象是 。 C A .中間代碼 B .單詞 C .源程序 D .元程序 5.同正規式(a|b )*等價的正規式為 。D A .(a|b)+ B .a*|b* C .(ab)* D .(a*|b*)+ 6. 兩個DFA 等價是指: 。 D A. 這兩個DFA 的狀態數相同
B. 這兩個DFA 的狀態數和有向弧條數都相等
C. 這兩個DFA 的有向弧條數相等
D. 這兩個DFA 接受的語言相同
7. 下列符號串不可以由符號集S ={a,b}上的正閉包運算產生的是:(A ) A. ε B. a C. aa D. ab 8.稱有限自動機A1和A2等價是指________。D A .A1和A2都是定義在一個字母表上的有限自動機 B .A1和A2狀態數和有向邊數相等
圖1-1
1
相關資源:編譯原理賦值語句的翻譯LL文法LR文法簡單優先法-專業指導文檔類...
文章知識點與官方知識檔案匹配
C技能樹首頁概覽
110422 人正在系統學習中
打開CSDN APP,看更多技術內容
編譯原理五 LR(1)分析法【C語言實現】_wangkay88的博客
1、使用 LR 的優點: (1)LR 分析器能夠構造來識別所有能用上下文無關文法寫的程序設計語言的結構。 (2)LR 分析方法是已知的最一般的無回溯移進-歸約方法,它能夠和其他移進-歸約方法 一樣有效地實現。 (3)LR 方法能分析的文法...
lr參數與C語言函數參數的區別_weixin_30254435的博客
LR參數是lr自己封裝的一個鍾對象, LR參數的表達方式:{ParamName}
編譯原理習題——第2章 文法和語言試卷
第2章 文法和語言試卷 1. 文法:G:S→xSx|y所識別的語言是(D)。 A. xyx B. (xyx)* C.x*yx* D. xnyxn(n≥0) 2. 給定文法A→bA|ca,為該文法句子的是(C)。 A. bba B. cab C. bca D. cba 3. 文法G產生的(D)的全體是該文法描述的語言。 A. 句型 B. 終結符集 C. 非終結符集 D. 句子 4. 若文法G...
繼續訪問
編譯原理習題(含答案)——2程序設計語言及其文法——哈工大陳鄞配套版本
程序設計語言及其文法1 文法:G:S→xSx | y所識別的語言是( )。 2 給定文法A→bA|ca,為該文法句子的是( )。A. bbaB. cabC. bcaD. Cba 3 設有文法G[S]:S->S1|S0|Sa|Sc|a|b|c,下列符號串中是該文法的句子有( )。A. ab0B. a0b01C. a0b0aD. bc10 4 文法G產生的( )的全體是該文法描述的語言。A. ...
繼續訪問
c語言lr分析器的設計與實現_[源碼和文檔分享]基於LR分析法的簡單分析法...
通過設計、編制、調試一個簡單計算器程序,加深對語法及語義分析原理的理解,並實現詞法分析程序對單詞序列的詞法檢查和分析。 二、課程設計內容及步驟 本次課程設計需要使用 LR 分析法完成簡單計算器的設計,其中算術表達式的文法如下: ...
C語言實現編譯原理的LR分析法,編譯原理LR(0)分析器(C語言).pdf
1LR 分析法 LR LR 「 分析法是一種自底向上進行的規范規約的語法分析方法, 指 自左向 右掃描和自底向上進行歸約」。LR 分析法的一個主要缺點是,若用手工構造分析 LR 器則工作量相當大,因此必須求助於自動產生 分析器的產生器。
編譯原理 第三章 詞法分析
1、詞法分析器的輸出結果是單詞的種類編碼和自身值 2、詞法分析器不能發現括弧不匹配 3、不存在語言能被確定的有窮自動機識別但不能用正則表達式表示 4、兩個有窮自動機等價實質它們的所識別的語言相等 5、詞法分析器用於識別單詞 6、正則表達式R1和R2等價是指R1和R2代表同一正則集 7、已知文法G[S]:S->A1, A->A1|S0|0,與G等價的正規式是0(1|10)^1 8、與(a...
繼續訪問
【編譯原理-練習題-1】概述部分與詞法分析部分選擇,填空,判斷,多選題
一、單項選擇題 1.構造編譯程序應掌握 (D ) 。 a. 源程序 b. 目標語言 c. 編譯方法 d. 以上三項都是 2.編譯程序絕大多數時間花在 (D) 上。 a. 出錯處理 b. 詞法分析 c. 目標代碼生成 d. 表格管理 3.DFA M(見圖1-1)接受的字集為(D ) 。 a. 以0開頭的二進制數組成的集合 b. 以0結尾的二進制數組成的集合 ...
繼續訪問
LR中用C語言比較兩個字元串變數_花露絲雨的博客
6.lr_save_string( "We can see the string:nancy","string1" ); 7.lr_save_string( "We can see the string:nancy","string2" ); 8.lr_output_message("the string1 is %s.",lr_eval_string("{string1}")); ...
c語言字元串變數的比較,LR中用C語言比較兩個字元串變數.doc_夢符佳月...
LR中用C語言比較兩個字元串變數 Zee的早期文檔.一:以下腳本,定義兩個一樣的字元數組,對比後,列印出result的值: vuser_init() { int result; ? ???char string1[] = "We can see the string:zee"; ...
最新發布 編譯原理刷題(個人向)
編譯原理刷題
繼續訪問
【編譯原理】課後習題
1.構造編譯程序應掌握:源程序、目標語言、編譯方法 2.編譯程序絕大多數時間花在表格管理上 3. 4.一個程序是正確的,包括兩層含義:一是書寫正確;二是含義正確 (合乎語法規則、合乎語義規則) 5.描述高級語言語法常用的方法有語法樹、BNF範式、擴充的BNF範式等 6.程序語言一般可以分為低級語言和高級語言兩大類,其中低級語言通常又稱為面向機器的語言。面向機器語言指的是特定計算機系統所...
繼續訪問
C語言實現編譯原理的LR分析法,實驗三編譯原理綜合實驗報告——(LR...
注意:本例是利用LR(0)分析來實現的語法分析,同學在寫實驗報告的時候,在結果分析這一塊可以選用課堂講過的LR(0)文法來說明驗證結果即可。 同時附上你所選用的文法對應的LR(0)分析表。
編譯原理總結,看這一篇就夠了!_LeeDuo.的博客_編譯原理
1.詞法分析:對源程序的字元串進行掃描和分解,識別出每個單詞符號。 2.語法分析:根據語言的語法規則,把單詞符號分解成各類語法單位。 3.語義分析與中間代碼生成:對各種語法范疇進行靜態語義檢查,若正確則進行中間代碼翻譯。 4.代碼優化:...
C語言LR(1)文法
用C語言編寫,對一個LR(1)文法分析,文法為:實現兩個數的加減乘除四則運算。並能得出計算結果。
熱門推薦 編譯原理習題(含答案)——3詞法分析——哈工大陳鄞配套版本
詞法分析1 詞法分析器的輸出結果是( )。A. 單詞自身值B. 單詞在符號表中的位置C. 單詞的種別編碼 D. 單詞的種別編碼和自身值2 詞法分析器不能( )。A. 識別出數值常量B. 過濾源程序中的注釋C. 掃描源程序並識別記號D. 發現括弧不匹配 3 ( )這樣一些語言,它們能被確定的有窮自動機識別,但不能用正則表達式表示。A. 存在B. 不存在C. 無法判定是否存在D. 以上答案都不對 4 ...
繼續訪問
C--編譯器:C--編譯器,實現LL(1)\ LR(0)\ SLR \ LR(1)並生成語義分析和MIPS
實現了自製的C--語言的一遍掃描編譯,包括詞法分析,LR(1)語法分析,屬性文法+中間代碼生成,MIPS編譯生成編譯腳本由python實現,兼容python2.7與3.7,圖形界面由WPF實現,使用了IronPython進行腳本執行 支持以下特性: 一種基本類型int 賦值表達式,循環/選擇/判斷/跳出語句 函數定義與函數調用 未實現: 浮點數,字元,字元串 斑點 錯誤檢查
編譯原理之LR(0)分析演算法的c實現
LR(0)分析器的構造演算法如下: 對一個文法構造了它的LR(0)分析表後就可以在LR分析器的總控程序(驅動程序)控制下對輸入串進行分析,即根據輸入串的當前符號和分析棧的棧頂狀態查找分析表應採取的動作,對狀態棧和符號棧進行相應的操作即移進、歸約、接受或報錯。具體說明如下: (1)若ACTION[S,a]=Sj,a為終結符,則把a移入符號棧,j移入狀態棧; (2)若ACTION[S,a]=rj,
繼續訪問
編譯原理第一章自測題
第一章 高級語言與編譯程序概述 一、單項選擇題 1.將編譯程序分成若干個「遍」是為了____ 。 A. 提高程序的執行效率 B. 使程序的結構更加清晰 C. 利用有限的機器內存並提高機器的執行效率 D. 利用有限的機器內存但降低了機器的執行效率 2.構造編譯程序應掌握 ____ 。 A. 源程序 B. 目標語言 C. 編譯方法 D. 以上三項都是 3.編譯程序絕大多數時間花在 ____ 上。 A. 出錯處理 B. 詞法分析 C. 目標代碼生成 D. 管理表格
C語言語法分析程序(編譯原理:LR)
北郵大三編譯原理課程序 注釋很詳細
用c++實現LR語法分析器
通過LR分析表及三個棧形成對輸入表達式的判斷! 。
c語言lr文法還是ll文法,編譯原理第五章語法分析課後題
(先補到這里,後面如果有需要的話,垃圾博主還會回來繼續更的。。。)5.1 遞歸子程序法屬於()語法分析方法A. 自頂向下B. 自底向上C. 自左向右D. 自右向左5.2 採用確定的自頂向下分析時,必須()A. 消除左遞歸B. 消除右遞歸C. 避免回溯D. 提取左公因子5.3 自上而下語法分析的主要分析動作是A. 推導B. 移進C. 歸約D. 匹配5.4 一個字元屬於FOLLOW(S),這個字元的含...
繼續訪問
編譯原理,C語言實現LR(0)分析(擴展文法的生成、項目集規范簇的生成、ACTION GOTO表的生成、句子的分析)
編譯原理,C語言實現LR(0)分析(擴展文法的生成、項目集規范簇的生成、ACTION GOTO表的生成、句子的分析) (1)根據提示輸入文法的個數 (2)輸入文法 (3)擴展文法的生成、項目集規范簇的生成、ACTION GOTO表的生成 (3)分析句子 (4)生成分析過程 C語言實現LR(0)分析源代碼
繼續訪問
編譯程序基本原理
編譯程序和解釋程序 人們利用高級語言與計算機進行交互, 但計算機仍然只能理解和執行由 0, 1序列構成的機器語言, 因此高級程序設計語言需要翻譯, 擔負這一任務的程序稱為"語言處理程序", 由於應用的不同, 語言之間的翻譯也是多種多樣的. 大致可分為 匯編程序、解釋程序和編譯程序. 用某種高級語言或匯編語言編寫的程序稱為 源程序, 源程序不能直接在計算機上執行. 如果源程序是用匯編語言寫的, ...
繼續訪問
LR腳本用戶自定義C語言函數
LR腳本實戰:用戶自定義C語言函數 Loadrunner可以使用標准C語言的函數,因此我們可以在腳本中編寫自己的函數用於調用,把腳本結構化,更好的進行重用。 先看一個例子: Action() { int i,j; j = 1; for (i=0;i<10;i++) { lr_message("i+j=%d",sum(i,j)); j++; } ...
繼續訪問
編譯原理,第一章緒論
編譯過程和編譯程序結構 五個階段: 詞法分析 語法分析 語義分析和中間代碼生成 優化 目標代碼生成 編譯程序的開發 自編譯:用某種高級語言編寫自己的編譯程序稱為自編譯, 交叉編譯:用A機器上的編譯程序來產生可在B機器上運行的目標代碼 自展:首先確定一個非常簡單的核心語言L0,然後用機器語言或者匯編語言寫出它的編譯程序T0,再把語言L0擴充到L1,用L0編寫L1的編譯程序T1,這樣不斷擴展下去...
繼續訪問
c語言是 ll文法和lr文法哪個好
c語言lr文法還是ll文法
寫評論
評論
收藏
點贊
踩
分享
C. 編譯原理試題
習題一、單項選擇題
1、將編譯程序分成若干個「遍」是為了 。
a.提高程序的執行效率
b.使程序的結構更加清晰
c.利用有限的機器內存並提高機器的執行效率
d.利用有限的機器內存但降低了機器的執行效率
2、構造編譯程序應掌握 。
a.源程序 b.目標語言
c.編譯方法 d.以上三項都是
3、變數應當 。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4、編譯程序絕大多數時間花在 上。
a.出錯處理 b.詞法分析
c.目標代碼生成 d.管理表格
5、 不可能是目標代碼。
a.匯編指令代碼 b.可重定位指令代碼
c.絕對指令代碼 d.中間代碼
6、使用 可以定義一個程序的意義。
a.語義規則 b.詞法規則
c.產生規則 d.詞法規則
7、詞法分析器的輸入是 。
a.單詞符號串 b.源程序
c.語法單位 d.目標程序
8、中間代碼生成時所遵循的是- 。
a.語法規則 b.詞法規則
c.語義規則 d.等價變換規則
9、編譯程序是對 。
a.匯編程序的翻譯 b.高級語言程序的解釋執行
c.機器語言的執行 d.高級語言的翻譯
10、語法分析應遵循 。
a.語義規則 b.語法規則
c.構詞規則 d.等價變換規則
解答
1、將編譯程序分成若干個「遍」是為了使編譯程序的結構更加清晰,故選b。
2、構造編譯程序應掌握源程序、目標語言及編譯方法等三方面的知識,故選d。
3、對編譯而言,變數既持有左值又持有右值,故選c。
4、編譯程序打交道最多的就是各種表格,因此選d。
5、目標代碼包括匯編指令代碼、可重定位指令代碼和絕對指令代碼3種,因此不是目標代碼的只能選d。
6、詞法分析遵循的是構詞規則,語法分析遵循的是語法規則,中間代碼生成遵循的是語義規則,並且語義規則可以定義一個程序的意義。因此選a。
7、b 8、c 9、d 10、c
二、多項選擇題
1、編譯程序各階段的工作都涉及到 。
a.語法分析 b.表格管理 c.出錯處理
d.語義分析 e.詞法分析
2、編譯程序工作時,通常有 階段。
a.詞法分析 b.語法分析 c.中間代碼生成
d.語義檢查 e.目標代碼生成
解答
1.b、c 2. a、b、c、e
三、填空題
1、解釋程序和編譯程序的區別在於 。
2、編譯過程通常可分為5個階段,分別是 、語法分析 、代碼優化和目標代碼生成。 3、編譯程序工作過程中,第一段輸入是 ,最後階段的輸出為 程序。
4、編譯程序是指將 程序翻譯成 程序的程序。 解答
是否生成目標程序 2、詞法分析 中間代碼生成 3、源程序 目標代碼生成 4、源程序 目標語言
一、單項選擇題
1、文法G:S→xSx|y所識別的語言是 。
a. xyx b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法G描述的語言L(G)是指 。
a. L(G)={α|S+ ⇒α , α∈VT*} b. L(G)={α|S*⇒α, α∈VT*}
c. L(G)={α|S*⇒α,α∈(VT∪VN*)} d. L(G)={α|S+ ⇒α, α∈(VT∪VN*)}
3、有限狀態自動機能識別 。
a. 上下文無關文法 b. 上下文有關文法
c.正規文法 d. 短語文法
4、設G為算符優先文法,G的任意終結符對a、b有以下關系成立 。
a. 若f(a)>g(b),則a>b b.若f(a)<g(b),則a<b
c. a~b都不一定成立 d. a~b一定成立
5、如果文法G是無二義的,則它的任何句子α 。
a. 最左推導和最右推導對應的語法樹必定相同
b. 最左推導和最右推導對應的語法樹可能不同
c. 最左推導和最右推導必定相同
d. 可能存在兩個不同的最左推導,但它們對應的語法樹相同
6、由文法的開始符經0步或多步推導產生的文法符號序列是 。
a. 短語 b.句柄 c. 句型 d. 句子
7、文法G:E→E+T|T
T→T*P|P
P→(E)|I
則句型P+T+i的句柄和最左素短語為 。
a.P+T和i b. P和P+T c. i和P+T+i d.P和T
8、設文法為:S→SA|A
A→a|b
則對句子aba,下面 是規范推導。
a. SÞSAÞSAAÞAAAÞaAAÞabAÞaba
b. SÞSAÞSAAÞAAAÞAAaÞAbaÞaba
c. SÞSAÞSAAÞSAaÞSbaÞAbaÞaba
d. SÞSAÞSaÞSAaÞSbaÞAbaÞaba
9、文法G:S→b|∧(T)
T→T,S|S
則FIRSTVT(T) 。
a. {b,∧,(} b. {b,∧,)} c.{b,∧,(,,} d.{b,∧,),,}
10、產生正規語言的文法為 。
a. 0型 b. 1型 c. 2型 d. 3型
11、採用自上而下分析,必須 。
a. 消除左遞歸 b. 消除右遞歸 c. 消除回溯 d. 提取公共左因子
12、在規范歸約中,用 來刻畫可歸約串。
a. 直接短語 b. 句柄 c. 最左素短語 d. 素短語
13、有文法G:E→E*T|T
T→T+i|i
句子1+2*8+6按該文法G歸約,其值為 。
a. 23 B. 42 c. 30 d. 17
14、規范歸約指 。
a. 最左推導的逆過程 b. 最右推導的逆過程
c. 規范推導 d. 最左歸約的逆過程
[解答]
1、選c。
2、選a。
3、選c。
4、雖然a與b沒有優先關系,但構造優先函數後,a與b就一定存在優先關系了。所以,由f(a)>g)(b)或f(a)<g(b)並不能判定原來的a與b之間是否存在優先關系:故選c。
5、如果文法G無二義性,則最左推導是先生長右邊的枝葉:對於d,如果有兩個不同的是了左推導,則必然有二義性。故選a。
6、選c。
7、由圖2-8-1的語法樹和優先關系可以看出應選b。
8、規范推導是最左推導,故選d。
9、由T→T,…和T→(… 得FIRSTVT(T))={(,,)};
由T→S得FIRSTVT(S)⊂FIRSTVT(T),而FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,}; 因此選c。
10、d 11、c 12、b 13、b 14、b
二、多項選擇題
1、下面哪些說法是錯誤的 。
a. 有向圖是一個狀態轉換圖 b. 狀態轉換圖是一個有向圖
c.有向圖是一個DFA d.DFA可以用狀態轉換圖表示
2、對無二義性文法來說,一棵語法樹往往代表了 。
a. 多種推導過程 b. 多種最左推導過程 c.一種最左推導過程
d.僅一種推導過程 e.一種最左推導過程
3、如果文法G存在一個句子,滿足下列條件 之一時,則稱該文法是二義文法。
a. 該句子的最左推導與最右推導相同
b. 該句子有兩個不同的最左推導
c. 該句子有兩棵不同的最右推導
d. 該句子有兩棵不同的語法樹
e.該句子的語法樹只有一個
4、有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不產生下面 集合。
a. {anbmcndm|n,m≥0} b. {anbncmdm|n,m>0}
c. {anbmcmdn|n,m≥0} d. {anbncmdm|n,m≥0}
e. {anbncndn|n≥0}
5、自下而上的語法分析中,應從 開始分析。
a. 句型 b. 句子 c. 以單詞為單位的程序
d. 文法的開始符 e. 句柄
6、對正規文法描述的語言,以下 有能力描述它。
a.0型文法 b.1型文法 c.上下文無關文法 d.右線性文法 e.左線性文法
解答 1、e、a、c 2、a、c、e 3、b、c、d 4、a、c 5、b、c 6、a、b、c、d、e
三、填空題
1、文法中的終結符和非終結符的交集是 。詞法分析器交給語法分析器的文法符號一定是 ,它一定只出現在產生式的 部。
2、最左推導是指每次都對句型中的 非終結符進行擴展。
3、在語法分析中,最常見的兩種方法一定是 分析法,另一是 分析法。
4、採用 語法分析時,必須消除文法的左遞歸。
5、 樹代表推導過程, 樹代表歸約過程。
6、自下而上分析法採用 、歸約、錯誤處理、 等四種操作。
7、Chomsky把文法分為 種類型,編譯器構造中採用 和 文法,它們分別產生 和 語言,並分別用 和 自動機識別所產生的語言。
解答 1、空集 終結符 右
2、最左
3、自上而上 自下而上
4、自上而上
5、語法 分析
6、移進 接受
7、4 2 型 3型 上下文無關語言 正規語言 下推自動機 有限
四、判斷題
1、文法 S→aS|bR|ε描述的語言是(a|bc)* ( )
R→cS
2、在自下而上的語法分析中,語法樹與分析樹一定相同。 ( )
3、二義文法不是上下文無關文法。 ( )
4、語法分析時必須先消除文法中的左遞歸。 ( )
5、規范歸約和規范推導是互逆的兩個過程。 ( )
6、一個文法所有句型的集合形成該文法所能接受的語言。 ( )
解答 1、對 2、錯 3、錯 4、錯 5、錯 6、錯
五、簡答題
1、句柄 2、素短語 3、語法樹 4、歸約 5、推導
[解答]
1、句柄:一個句型的最左直接短語稱為該句型的句柄。
2、素短語:至少含有一個終結符的素短語,並且除它自身之外不再含任何更小的素短語。
3、語法樹:滿足下面4個條件的樹稱之為文法G[S]的一棵語法樹。
①每一終結均有一標記,此標記為VN∪VT中的一個符號;
②樹的根結點以文法G[S]的開始符S標記;
③若一結點至少有一個直接後繼,則此結點上的標記為VN中的一個符號;
④若一個以A為標記的結點有K個直接後繼,且按從左至右的順序,這些結點的標記分別為X1,X2,…,XK,則A→X1,X2,…,XK,必然是G的一個產生式。
4、歸約:我們稱αγβ直接歸約出αAβ,僅當A→γ 是一個產生式,且α、β∈(VN∪VT)*。歸約過程就是從輸入串開始,反復用產生式右部的符號替換成產生式左部符號,直至文法開始符。
5、推導:我們稱αAβ直接推出αγβ,即αAβÞαγβ,僅當A→ γ 是一個產生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,則我們稱這個序列是從α1至α2的一個推導。若存在一個從α1αn的推導,則稱α1可推導出αn。推導是歸約的逆過程。
六、問答題
1、給出上下文無關文法的定義。
[解答]
一個上下文無關文法G是一個四元式(VT,VN,S, P),其中:
●VT是一個非空有限集,它的每個元素稱為終結符號;
●VN是一個非空有限集,它的每個元素稱為非終結符號,VT∩VN=Φ;
●S是一個非終結符號,稱為開始符號;
●P是一個產生式集合(有限),每個產生式的形式是P→α,其中,P∈VN,
α∈(VT∪VN)*。開始符號S至少必須在某個產生式的左部出現一次。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的語言是什麼?
[解答]
(1)由於產生式左部存在終結符號,且所有產生式左部符號的長度均小於等於產生式右部的符號長度,所以文法G[S]是Chomsky1型文法,即上下文有關文法。
(2)按產生式出現的順序規定優先順序由高到低(否則無法推出句子),我們可以得到:
SÞabQÞabc
SÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbcc
SÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞ
aaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc
……
於是得到文法G[S]生成的語言L={anbncn|n≥1}
3、按指定類型,給出語言的文法。
L={aibj|j>i≥1}的上下文無關文法。
【解答】
(1)由L={aibj|j>i≥1}知,所求該語言對應的上下文無關文法首先應有S→aSb型產生式,以保證b的個數不少於a的個數;其次,還需有S→Sb或S→bS型的產生式,用以保證b的個數多於a的個數;也即所求上下文無關文法G[S]為:
G[S]:S→aSb|Sb|b
4、有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)試求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)寫出句子acabcbbdcc的最左推導過程。
【解答】(1)分別畫出對應兩句型的語法樹,如圖2-8-2所示
句柄:AaB Bd
圖2-8-2 語法樹
(2)句子acabcbbdcc的最左推導如下:
SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcA
ÞacabcbbdcAÞacabcbbdcc
5、對於文法G[S]:
S→(L)|aS|a L→L, S|S
(1)畫出句型(S,(a))的語法樹。(2)寫出上述句型的所有短語、直接短語、句柄和素短語。
【解答】
(1)句型(S,(a))的語法樹如圖2-8-3所示
(2)由圖2-8-3可知:
①短語:S、a、(a)、S,(a)、(S,(a));
②直接短語:a、S;
③句柄:S;
④素短語:素短語可由圖2-8-3中相鄰終結符之間的優先關系求得,即;
因此素短語為a。
6、考慮文法G[T]:
T→T*F|F
F→F↑P|P
P→(T)|i
證明T*P↑(T*F)是該文法的一個句型,並指出直接短語和句柄。
【解答】
首先構造T*P↑(T*F)的語法樹如圖2-8-4所示。
由圖2-8-4可知,T*P↑(T*F)是文法G[T]的一個句型。
直接短語有兩個,即P和T*F;句柄為P。
一、單項選擇題
1、詞法分析所依據的是 。
a. 語義規則 b. 構詞規則 c. 語法規則 d. 等價變換規則
2、詞法分析器的輸出結果是 。
a. 單詞的種別編碼 b. 單詞在符號表中的位置
c. 單詞的種別編碼和自身值 d. 單詞自身值
3、正規式M1和M2等價是指 。
a. M1和M2的狀態數相等 b. M1和M2的有向弧條數相等
c. M1和M2所識別的語言集相等 d. M1和M2狀態數和有向弧條數相等
4、狀態轉換圖(見圖3-6-1)接受的字集為 。
a. 以 0開頭的二進制數組成的集合 b. 以0結尾的二進制數組成的集合
c. 含奇數個0的二進制數組成的集合 d. 含偶數個0的二進制數組成的集合
5、詞法分析器作為獨立的階段使整個編譯程序結構更加簡潔、明確,因此, 。
a. 詞法分析器應作為獨立的一遍 b. 詞法分析器作為子程序較好
c. 詞法分析器分解為多個過程,由語法分析器選擇使用 d. 詞法分析器並不作為一個獨立的階段
解答 1、b 2、c 3、c 4、d 5、b
二、多項選擇題
1、在詞法分析中,能識別出 。
a. 基本字 b. 四元式 c. 運算符
d. 逆波蘭式 e. 常數
2、令∑={a,b},則∑上所有以b開頭,後跟若干個ab的字的全體對應的正規式為 。
a. b(ab)* b. b(ab)+ c.(ba)*b
d. (ba)+b e. b(a|b)
解答 1、a、c、e 2、a、b、d
三、填空題
1、確定有限自動機DFA是 的一個特例。
2、若二個正規式所表示的 相同,則認為二者是等價的。
3、一個字集是正規的,當且僅當它可由 所 。
解答 1、NFA 2、正規集 3、DFA(NFA)所識別
四、判斷題
1、一個有限狀態自動機中,有且僅有一個唯一終態。 ( )
2、設r和s分別是正規式,則有L(r|s)=L(r)|L(s)。 ( )
3、自動機M和M′的狀態數不同,則二者必不等價。 ( )
4、確定的自動機以及不確定的自動機都能正確地識別正規集。 ( )
5、對任意一個右線性文法G,都存在一個NFA M,滿足L(G)=L(M)。 ( )
6、對任意一個右線性文法G,都存在一個DFA M,滿足L(G)=L(M)。 ( )
7、對任何正規表達式e,都存在一個NFA M,滿足L(G)=L(e)。 ( )
8、對任何正規表達式e,都存在一個DFA M,滿足L(G)=L(e)。 ( )
解答 1 、2、3、錯 4、5、6、7、8、正確
五、基本題
1、設M=({x,y}, {a,b}, f,x,{y})為一非確定的有限自動機,其中f定義如下:
f(x,a)={x,y} f(x,b)={y}
f(y,a)=φ f(y,b)={x,y}
試構造相應的確定有限自動機M′。
解答:對照自動機的定義M=(S,Σ,f,S0,Z),由f的定義可知f(x,a)、f(y,b)均為多值函數,所以是一非確定有限自動機,先畫出NFA M相應的狀態圖,如圖3-6-2所示。
用子集法構造狀態轉換矩陣表3-6-3所示。
I Ia Ib
{x} {x,y} {y}
{y} — {x,y}
{x,y} {x,y} {x,y}
將轉換矩陣中的所有子集重新命名而形成表3-6-4所示的狀態轉換矩陣。
表3-6-4 狀態轉換矩陣
a b
0 2 1
1 — 2
2 2 2
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其狀態轉換圖如圖3-6-5所示。
將圖3-6-5的DFA M′最小化。首先,將M′的狀態分成終態組{1,2}與非終態組{0};其次,考察{1,2}。由於{1,2}a={1,2}b={2}⊂{1,2},所以不再將其劃分了,也即整個劃分只有兩組{0},{1,2}:令狀態1代表{1,2},即把原來到達2的弧都導向1,並刪除狀態2。最後,得到如圖3-6-6所示化簡DFA M′。
2、對給定正規式b*(d|ad)(b|ab)+,構造其NFA M;
解答:首先用A+=AA*改造正規式得:b*(d|ad)(b|ab)(b|ab)*;其次,構造該正規式的NFA M,如圖3-6-7所示。
D. 編譯原理題:分別構造下列語言的文法(4個題) 200分獻上。。。
(3)任何不是以0打頭的所有奇整數所組成的集合
解:G(S)
=
({S,A,B,I,J},{-,0,1,2,3,4,5,6,7,8,9},{S→J|IBJ,B→0B|IB|e,
I→J|2|4|6|8,
Jà1|3|5|7|9},S)
(4)所有偶數個0和偶數個1所組成的符號串集合
解:對應文法為
S→0A|1B|e,A→0S|1C
B→0C|1S
C→1A|0B
E. 給力!2011年新年散分啦。高分求助編譯原理高手幫忙做幾道模擬題
三、( 8 分)化簡文法 G[S] :
S → ASe | BCaD | aD | AC
A → Cb | DBS
C → bC | d
B → Ac
D → Ad
化簡後: S → ASe|AC A → Cb C → bC | d
四、( 12 分) 設 L í {a,b,c}* 是滿足下述條件的符號串構成的語言:
(1)若出現 a ,則其後至少緊跟兩個 c ;
(2)若出現 b ,其後至少緊跟一個 c 。
試構造識別 L 的最小化的 DFA ,並給出描述 L 的正規表達式。
答:DFA 如圖所示。相應的正規式為 (c|acc|bc)* 。
五、( 12 分) 已給文法 G[S] : S → SaP | Sf | P P → qbP | q
將 G[S] 改造成 LL ( 1 )文法,並給出 LL ( 1 )分析表。
答:改造後的文法: S → PS' S' → aPS'| fS' | e P → qP' P' → bP | e
各候選式的 FIRST 集,各非終結符的 FOLLOW 集為
產生式 FIRST 集 FOLLOW 集
S → PS' {q} {#}
S' → aPS'
→ fS'
→ e {a}
{f}
{ e } {#}
P → qP' {q} {a,f,#}
P' → bP
→ e {b}
{ e } {a,f,#}
LL(1) 分析表為
六、( 12 分) 給定文法 G[S] : S → Aa|dAb|Bb|dBa A → c B → c
構造文法 G[S] 的 LR ( 1 )分析表。
分析表如下圖所示
七、( 8 分) 將下面的條件語句表示成逆波蘭式和四元式序列:
if a>b then x:=a+b*c else x:=b-a;
答:( 1 )逆波蘭式:
,其中, BLE 表示汪或等於時的轉向指令; [ … ] 表示標號。
( 2 )四元式:
(1) ( j>, a, b, (3))
(2) ( j, , , (7) )
(3) ( *, b, c, T1)
(4) ( +, a, T1, T2)
(5) ( :=, T2, , x)
(6) ( j, , , (9))
(7) ( -, b, a, T3)
(8) ( :=, T3, , x)
(9) ( … … )
八、( 8 分) 給定基本塊:
A:=3*5
B:=E+F
C:=A+12
D:=E+F
A:=D+12
C:=C+1
E:=E+F
假定出基本塊後,只有 A 、 C 、 E 是活躍的,給出用 DAG 圖完成優化後的代碼序列。
答:化簡後的的四元式序列為
A :=D+12
E :=E+F
C :=28
F. 編譯原理試題
你發那麼多條求助信息,也不給點分,大家怎麼幫你啊,我來回答吧!記得給我追加分啊。
1.若源程序是用高級語言編寫的,目標程序是 機器語言程序或匯編程序 ,則其翻譯程序稱為編譯程序.
2.一個典型的編譯程序中,不僅包括詞法分析、語法分析、中間代碼生成、代碼優化、目標代碼生成等五個部分,還應包括表格處理和出錯處理。其中,詞法分析器用於識別 單詞 。
3.編譯方式與解釋方式的根本區別為是否生成目標代碼。
4.設G是一個給定的文法,S是文法的開始符號,如果S x(其中x∈V*),則稱x是文法的一個句型 。
設G是一個給定的文法,S是文法的開始符號,如果S x(其中x∈VT*),則稱x是文法的一個句子。
繼續做題中.......
G. 求《編譯原理》第三版(西北工業大學出版社)課後題答案
答案我已發到你的郵箱
節選:
第二章
2.3
敘述由下列正規式描述的語言
a)
0(0|1)*0
b)
((ε|0)1*)*
c)
(0|1)*0(0|1)(0|1)
d)
0*10*10*10*
e)
(00|11)*((01|10)(00|11)*(01|10)(00|11)*)*
Answer:
a)
以0開始和結尾,而且長度大於等於2的0、1串
b)
所有0,1串(含空串)
c)
倒數第三位是0的0、1串
d)
僅含3個1的0、1串
e)
偶數個0和偶數個1的0、1串(含空串)