display表編譯原理
㈠ 這段c語言中display()函數是什麼意思
void
display(int)
//在c語言中,這是一個函數聲明.表明該函數的參數類型為int,返回值類型為void
//如果後面緊跟著大括弧的話,那就這就是一個函數定義。
//在c程序中,函數必須需要先聲明後使用,和變數的使用一樣
㈡ display的儲存方式
首先我們要了解display命令的用途是什麼,通過help display,我們可以看到在Stata中,對display的解釋如下:
即顯示字元串和標量表達式中的特定值。
它的語法結構如下:
可以看槐脊到,display有顯示字元串(string),設置輸出結果顯示樣式("[%fmt]"游運)等多種用途。
於是,結合以上語法結構,我們為大家詳細介紹display命令的主要功能及用法:
(1)計算
在某種意義上,display就相當於計算器,可以進行基本數學運算,如:
di -( 2+ 3^( 2- 3))/sqrt( 2* 3)
我們還可以加入"[%fmt]"來設置顯示格式,如:
di % 5.3f ln( 8) //保留小數點後三位
(2)設置字元串顯示樣式
display還可以用於顯示字元串。這里要注意:display後接字元串需要添加雙引號,但是運行出來的字元串則無雙引號顯示。如:
di "爬蟲俱樂部 將爬蟲進行到底"
di "爬蟲俱樂部""將爬蟲進行到底"
Note:當我們輸入多個字元串時,添加空格的位置不同會導致最終顯示效果不同。如果將空格放在字元串的引號裡面,那麼顯示出來的字元串中間有空格;如果將空格放在兩個字元串的引號之間,那麼顯示出來的字元串無空格。
如果display後接字元串中已有雙引號,則需要對該字元串添加復合雙引號(`"compound double-quoted string"')。此時,原字元串中的雙引號會正常顯示,而整個字元串外無雙引號顯示,如:
di ` "爬蟲俱樂部 將"爬蟲 "進行到底"'
同時,加入逗號","的個數不同,其顯示效果也會不同。
在display命令中,神明梁一個逗號","代表在獨立的字元串之間的一個空格;兩個逗號", ,"代表在獨立的字元串之間沒有空格。下面,我們就通過例子查看添加逗號個數的不同所帶來的不同顯示效果:
di "爬蟲俱樂部", "將爬蟲進行到底"
di "爬蟲俱樂部", , "將爬蟲進行到底"
可以看到,當我們在兩個獨立的字元串之間添加一個逗號","時,顯示的字元串之間有一個空格;當添加兩個逗號", ,"時,顯示的字元串之間沒有空格。同理,添加三個逗號,四個逗號的顯示效果分別和添加一個逗號,兩個逗號的效果相同,在此就不一一贅述。
(3)顯示宏中定義的字元串
display不僅可以設置字元串顯示樣式,還可以在結果窗口顯示宏中定義的字元串。我們以「Auto.dta」為例,使用display顯示summarize命令的返回值:
sysuse auto,clearsummarize mpg
㈢ 學了編譯原理這門課,要求編一個:詞法分析的程序,要求對詞法分析至少選擇三種不同類型的句子進行單詞識
給你一個toyl語言的
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#define is_end_of_input(ch) ((ch)=='#')
#define is_letter(ch) ('A'<=(ch)&&(ch)<='Z'||'a'<=(ch)&&(ch)<='z')
#define is_digit(ch) ('0'<=(ch)&&(ch)<='9')
#define is_digit_or_letter(ch) (is_letter(ch)||is_digit(ch))
#define is_operator(ch) ((ch)=='+'||(ch)='-'||(ch)='*')
#define is_layout(ch) (!is_end_of_input(ch)&&(ch)<=' ')
#define Step 10 //字元串每次增長的長度.
typedef struct
{
char * Class;
char seman[];
int len;
int value;
}mytoken;
typedef struct node
{
char words[20];
int length;
int time;
struct node *next;
}mynode;
//全局變數
char ch;
char *fp;
mytoken token;
int TYPE=-1;
int num=1;
int j=0;
int Length=0;
void error()//報錯
{
printf("錯誤\n");
}
char * getstr() //從鍵盤獲取任意長度的輸入函數實現
{
char *temp, *str=(char *)malloc(10);
int c=0, len=0, times=1, number=0;
if(!str)
{
printf("內存不足!");
return (char *)NULL;
}
number+=times*Step;
do //遇到#則輸入結束。
{
c=getchar();
if(len==number)
{
times++;
number=times*Step;
temp=str;
str=(char *)realloc(str,number);
if(str==NULL)
{
printf("內存不足!");
str=temp;
break;
}
}
*(str+len)=c;
len++;
}while(c!='#');
str=(char *)realloc(str,len+1); //字元串的最終長度調整.
*(str+len)='\0';
return str;
}
void next_char(void)//獲取下一個字元
{
ch=*fp;
fp=fp+1;
}
void next_valchar(void)//獲取第一個有效的字元,過濾空格等。
{
next_char();
if(ch=='#')exit(0);//當文件只有空格和#號時
while(is_layout(ch))
{
next_char();
//if(ch=='#')exit(0);
}
}
void back()//指針回走
{
fp=fp-1;
}
void recongnize_name(char chr)//識別字元串
{
char name[10];
int i=0;
name[i++]=ch;
next_char();
while(is_digit_or_letter(ch))
{
name[i++]=ch;
next_char();
}
if((ch!=' ')&&(ch!='\t')&&(ch!='\n')&&(ch!='#')&&(ch!=':')&&(ch!='(')&&(ch!=')')&&(ch!=';'))//轉非法字元串處理
{
do
{
name[i++]=ch;
next_char();
}while((ch!=' ')&&(ch!='\t')&&(ch!='\n')&&(ch!='#'));
if((name[i-1]=='#')||(name[i-1]=='\n'))//去掉結束符#或回車
{
name[i-1]='\0';
}
back();//指針回走
name[i]='\0';
printf("非法字元串\t%s\n",name);
}
else{
name[i]='\0';
if (name== "begin")
{
token.Class="BEGIN";
}
else if (name== "end")
{
token.Class="END";
}
else if (name=="read")
{
token.Class=="READ";
}
else if (name=="write")
{
token.Class="WRITE";
}
else
{
token.Class="IDEN";
int n=0;
Length=0;
while(name[n]!='\0')
{
token.seman[n]=name[n];
n++;
}
Length=n;
token.seman[n]=name[n];
}
back();
}
}
void recongnize_number(char cha)//識別數字
{
int N=0;
int m;
char name[10];//存非法字元串
int i=0;
while((m=is_digit(ch)))
{
N=N*10+(ch-'0');
name[i++]=ch;
next_char();
}
if(ch==' '||ch=='\t'||ch=='\n'||ch=='#'||(ch==';'))
{
token.Class="NUMB";
token.value=N;
back();
}
else//轉非法字元串處理
{
do
{
name[i++]=ch;
next_char();
}while((ch!=' ')&&(ch!='\t')&&(ch!='\n')&&(ch!='#'));
if((name[i-1]=='#')||(name[i-1]=='\n'))//去掉結束符#或回車
{
name[i-1]='\0';
}
back();//指針回走
name[i]='\0';
printf("非法字元串\t%s\n",name);
TYPE=-1;
}
}
int next_token(void)//讀下一個單詞
{
next_valchar();
char name[10];//存首字母非法的字元串
int fg=0;
int i=0;
if('0'<=(ch)&&(ch)<='9')
{
TYPE=0;
}
else if('A'<=(ch)&&(ch)<='Z'||'a'<=(ch)&&(ch)<='z')
{
TYPE=1;
}
else
{
TYPE=2;
}
switch(TYPE)
{
case 0:
recongnize_number(ch);break;
case 1:
recongnize_name(ch);break;
case 2:
switch(ch)
{
case '+' :
token.Class="ADD";
token.seman[0]='+';
token.seman[1]='\0';
TYPE=2;
break;
case '*' :
token.Class="MULT";
token.seman[0]='*';
token.seman[1]='\0';
TYPE=2;
break;
case ':' :
next_char();
if(ch!='=')
{
error();
TYPE=-1;
break;
}
token.Class="ASS";
token.seman[0]=':';
token.seman[1]='=';
token.seman[2]='\0';
TYPE=2;
break;
case ';' :
token.Class="SEMI";
token.seman[0]=';';
token.seman[1]='\0';
TYPE=2;
break;
case '(' :
token.Class="OPEN";
token.seman[0]='(';
token.seman[1]='\0';
TYPE=2;
break;
case ')' :
token.Class="CLOSE";
token.seman[0]=')';
token.seman[1]='\0';
TYPE=2;
break;
default :
fg=1;
break;
}
}
if(fg==1)//非法字元串處理
{
name[i++]=ch;
while((ch!=' ')&&(ch!='\t')&&(ch!='\n')&&(ch!='#'))
{
next_char();
name[i++]=ch;
}
if((name[i-1]=='#')||(name[i-1]=='\n'))//去掉結束符#或回車
{
name[i-1]='\0';
}
back();//指針回走
name[i]='\0';
printf("非法字元串\t%s\n",name);
TYPE=-1;//置TYPE為-1
}
}
int compare(node *head,char words[],int Length)//單詞的比較
{
node *p;
p=head;
if(head==NULL)
{
return 0;
}
else
{
int fg=1;
do
{
int i,j,succ;
i=0;
succ=0;
while((i<=p->length-Length)&&(!succ))
{
j=0;
succ=1;
while((j<Length)&&succ)
{
if(words[j]==(p->words[i+j]))
{
j++;
}
else
{
succ=0;
}
}
i++;
}
if(succ&&(j>=p->length))
{
(p->time)++;
fg=0;
}
if(p->next!=NULL)
{
p=p->next;
}
}while((p->next!=NULL)&&fg);
if(fg==0)
{
return 1;
}
else
{
return 0;
}
}
}
node *insert(node *head) //將讀到的新單詞加入鏈表
{
node *p;
p=(mynode*)malloc(sizeof(mynode));/*分配空間*/
strcpy(p->words,token.seman);
int n=0;
p->length=0;
p->time=1;
while(p->words[n]!='\0')
{
p->length++;
n++;
}
p->next=NULL;
if(head==NULL)
{
head=p;
}
else
{
p->next=head->next;
head->next=p;
}
return head;
}
void display(node *head)//列印鏈表的內容
{
node *p;
p=head;
if(!p) printf("\n無標識符!");
else
{
printf("\n各標識符或保留字及其出現的次數為:\n");
printf("標識符\t出現次數\n");
while(p) { printf("%s\t%d\n",p->words,p->time);p=p->next;}
}
}
int main(int argc, char *argv[])
{
char *str1=NULL;
printf("請輸入程序代碼:\n");
str1=getstr();//獲取用戶程序段的輸入
fp=str1;
mynode *head=NULL;
do{
next_token();
switch(TYPE)
{
case 0:
printf("[%d]\t(%s,\t\"%d\")\n",num++,token.Class,token.value);
break;
case 1:
case 2:
printf("[%d]\t(%s,\t\"%s\")\n",num++,token.Class,token.seman);
int f;
f=0;
f=compare(head,token.seman,Length);
if((TYPE==1)&&(f==0))
{
head=insert(head);
}
break;
default:
break;
}
}while(*fp!='#');
display(head);
return 0;
}
㈣ C語言 display 什麼意思
display()是一種函數,功能是顯示輸出函數。
例:
#include<iostream.h>
template<classk1,classk2>
voiddisplay(k1x,k2y);
voidmain()
{
charc='h',str[]="ok2002";
intn=100;
floatx=5.5;
doublez=1.23456;
//兩個參數類型相同
display(c,char(c+2));//hj
display(x,2*x);//5.511
display(n,2*n);//100200
display(str,str);//ok2002ok2002
display(z,2*z);//1.234562.46912
//兩個參數類型不同
display(c,str);//hok2002
display(str,2*x);//ok200211
display(str,c);//ok2002h
display(n,str);//100ok2002
display(z,n);//1.23456100
}
//定義名為display的函數模板
template<classk1,classk2>
voiddisplay(k1x,k2y)
{
cout<<x<<" "<<y<<endl;
}
(4)display表編譯原理擴展閱讀
C語言$diplay和$write任務
$display任務相當於C語言里的printf,用於輸出信息,他的基本格式$display(p0,p1,p2);意思就是把p1、p2以p1的格式輸出。
$monitor和$diplay的區別在於$monitor是連續監視數據的變化,因而往往只要在測試模塊的initial塊中調用一次就可以監控被測模塊中所有感興趣的信號不需要,也不能在always塊中調用$monitor。
在display中,輸出列表中的數據的現實寬度總是按照自動輸出格式進行調整的。因此,我們通常在%和表示進制的符號之間加一個0來確保總是用最少的位數來表示表達式的當前值。
例如
begin
r1=10;
$display("size=%d=%h",r1,r1);
$display("size=%0d=%0h",r1,r1);
輸出結果分別為10,00a和10,a
所以在以後寫程序時,為了養成良好習慣,應該注意加上0來保證代碼的可讀性。
如果輸出的列表中含有不定值或者高阻態時,要遵循下列情況。
㈤ 把編譯程序設計原理(第二版)高等教育出版社的課後答案給我發一份 可以嗎
目錄
第1章編譯器概述
1.1為什麼要學習編譯技術
1.2編譯器和解釋器
1.3編譯器的功能分解和組織結構
1.4編譯器的夥伴
1.5編譯器的復雜性
1.6編譯器的設計與實現
1.7編譯器的測試與維護
第2章一個微型編譯器
2.1基礎知識
2.2ToyL語言
2.3ToyL語言詞法分析器
2.4ToyL語言語法分析器
2.5ToyL語言解釋器
2.6ToyL語言編譯器
第3章有窮自動機與詞法分析
3.1詞法分析基礎
3.1.1詞法分析器的功能
3.1.2單詞識別
3.1.3詞法分析的復雜性
3.1.4字元串
3.1.5保留字處理
3.1.6空格符、回車符、換行符
3.1.7括弧類配對預檢
3.1.8詞法錯誤修正
3.1.9詞法分析獨立化的意義
3.2有窮自動機
3.2.1確定有窮自動機的定義
3.2.2確定有窮自動機的實現
3.2.3非確定有窮自動機
3.2.4NFA到DFA的轉換
3.2.5確定有窮自動機的極小化
3.2.6自動機狀態轉換表的實現
3.3正則表達式
3.3.1正則符號串集
3.3.2正則表達式的定義
3.3.3正則表達式的局限性
3.3.4正則定義
3.3.5正則表達式到有窮自動機的轉換
3.4詞法分析器的構造
3.4.1用DFA人工構造詞法分析器
3.4.2詞法分析器的生成器Lex
練習
第4章文法與語法分析
4.1語法分析
4.1.1語法分析器的輸入
4.1.2語法分析的任務
4.1.3語法分析方法分類
4.2文法和文法分析
4.2.1上下文無關文法和語言
4.2.2最左推導和最右推導
4.2.3語法分析樹與二義性
4.2.4文法分析演算法
4.2.5自頂向下方法概述
4.2.6自底向上方法概述
4.3遞歸下降法——自頂向下分析
4.3.1遞歸下降法原理
4.3.2消除公共前綴
4.3.3代入
4.3.4消除左遞歸
4.4LL分析方法——自頂向下分析
4.4.1LL(1)文法
4.4.2LL(1)分析表
4.4.3LL(1)分析的驅動器
4.4.4LL(1)中的If-Then-Else問題
4.4.5LL(1)分析器的自動生成器LLGen
4.4.6LL(1)分析法與遞歸下降法的比較
4.4.7正則文法
4.5LR方法——自底向上分析
4.5.1句柄
4.5.2活前綴
4.5.3歸約活前綴識別器——LR(0)自動機
4.5.4LR(0)文法及其分析演算法
4.5.5SLR(1)文法及其分析演算法
4.5.6LR(1)文法
4.5.7LALR(1)文法
4.5.8二義性文法的處理
4.5.9另一種Shift-Rece分析技術:簡單優先法
4.5.10LL(1)和LALR(1)方法比較
4.6LR分析器的生成器
4.6.1LALR分析器的生成器YACC
4.6.2LALR分析器的生成器LALRGen
4.7語法錯誤處理
4.7.1錯誤恢復和修復
4.7.2遞歸下降分析的錯誤恢復
4.7.3LL分析的錯誤恢復
4.7.4LR分析的錯誤恢復
練習
第5章語義分析
5.1語義分析基礎
5.1.1語義分析內容
5.1.2標識符信息的內部表示
5.1.3類型信息的內部表示
5.1.4運行時值的表示
5.2符號表
5.2.1符號表查找技術
5.2.2符號表的局部化
5.2.3二叉式局部符號表
5.2.4散列式全局符號表
5.2.5嵌套式全局符號表
5.2.6符號表界面函數
5.3類型分析
5.3.1類型的等價性和相容性
5.3.2類型分析的總控演算法
5.3.3類型名分析
5.3.4枚舉類型分析
5.3.5數組類型分析
5.3.6記錄類型分析
5.3.7聯合類型分析
5.3.8指針類型分析
5.3.9遞歸類型分析
5.4聲明的語義分析
5.4.1聲明的語法結構
5.4.2標號聲明部分的語義分析
5.4.3常量聲明部分的語義分析
5.4.4類型聲明部分的語義分析
5.4.5變數聲明部分的語義分析
5.4.6過程、函數聲明的語義分析
5.5執行體的語義分析
5.5.1執行體的語義分析
5.5.2帶標號語句和轉向語句的語義分析
5.5.3賦值語句的語義分析
5.5.4條件語句的語義分析
5.5.5while循環語句的語義分析
5.5.6for循環語句的語義分析
5.5.7過程調用語句的語義分析
5.5.8表達式的語義分析
5.5.9變數的語義分析
練習
第6章運行時的存儲環境
6.1運行時的存儲空間結構與分配
6.1.1運行時的存儲空間基本結構
6.1.2靜態區的存儲分配
6.1.3棧區的存儲分配
6.1.4堆區的存儲分配
6.1.5堆區空間管理
6.2過程活動記錄與棧區組織結構
6.2.1過程活動記錄
6.2.2活動記錄的填寫
6.2.3棧區組織結構——AR鏈
6.3運行時的變數訪問環境
6.3.1可訪問活動記錄
6.3.2局部Display表方法
6.3.3靜態鏈方法
6.3.4全局Display表方法和寄存器方法
6.3.5無嵌套時的AR及訪問環境
6.4分程序和動態數組空間
6.4.1無動態數組時的分程序空間
6.4.2動態數組空間
練習
第7章面向語法的語義描述
7.1動作文法
7.1.1動作文法定義
7.1.2動作文法的遞歸實現
7.1.3動作文法的LL實現
7.1.4動作文法的LR實現
7.2動作文法應用
7.2.1用動作文法描述表達式計算
7.2.2用動作文法描述表達式抽象樹的構造
7.2.3用動作文法描述語句抽象樹的構造
7.3抽象動作文法及其應用
7.3.1抽象變數
7.3.2抽象動作文法
7.3.3棧式LL動作文法驅動器
7.3.4抽象動作文法到棧式LL動作文法的轉換
7.3.5棧式LR動作文法驅動器
7.3.6抽象動作文法到棧式LR動作文法的轉換
7.4屬性文法
7.4.1屬性文法定義
7.4.2屬性語法樹和屬性依賴圖
7.4.3計算順序
7.4.4屬性值的計算方法
7.4.5拷貝型屬性文法
7.5屬性文法在編譯器設計中的應用
7.5.1類型樹的屬性文法描述
7.5.2表達式中間代碼的屬性文法描述
7.5.3變數中間代碼的屬性文法描述
7.5.4語句中間代碼的屬性文法描述
7.5.5正則表達式到自動機轉換的屬性文法描述
7.6S-屬性文法及其屬性計算
7.6.1S-屬性文法
7.6.2S-屬性文法的遞歸實現
7.6.3S-屬性文法的LR實現
7.7L-屬性文法及其屬性計算
7.7.1L-屬性文法
7.7.2L-屬性文法的遞歸實現
7.7.3L-屬性文法的LR(1)實現
7.8語義分析器的自動生成系統
7.8.1YACC
7.8.2LALRGen
7.8.3Accent系統
練習
第8章中間代碼生成
8.1中間代碼
8.1.1中間代碼的種類
8.1.2後綴式中間代碼
8.1.3三地址中間代碼
8.1.4抽象語法樹和無環有向圖
8.1.5多元式中間代碼
8.1.6中間代碼分量ARG結構
8.2表達式的中間代碼生成
8.2.1表達式的語義信息
8.2.2表達式的中間代碼
8.2.3變數的中間代碼
8.2.4表達式的中間代碼生成
8.2.5變數的中間代碼生成
8.2.6布爾表達式的短路中間代碼
8.3原子語句的中間代碼生成
8.3.1輸入/輸出語句的中間代碼生成
8.3.2goto語句和標號定位語句的中間代碼生成
8.3.3return語句的中間代碼生成
8.3.4賦值語句的中間代碼生成
8.3.5函數(過程)調用的中間代碼生成
8.4結構語句的中間代碼生成
8.4.1條件語句的中間代碼生成
8.4.2while語句的中間代碼生成
8.4.3repeat語句的中間代碼生成
8.4.4for語句的中間代碼生成
8.4.5case語句的中間代碼生成
8.4.6函數聲明的中間代碼生成
練習
第9章中間代碼優化
9.1引言
9.1.1優化的目標和要求
9.1.2優化的必要性
9.1.3優化的內容
9.1.4局部優化和全局優化
9.1.5基本塊和程序流圖
9.2常表達式優化
9.2.1常表達式的局部優化
9.2.2基於常量定值分析的常表達式全局優化
9.2.3常量定值分析
9.3公共表達式優化
9.3.1基於相似性的公共表達式局部優化
9.3.2基於值編碼的公共表達式局部優化
9.3.3基於活躍代碼分析的公共表達式全局優化
9.3.4活躍運算代碼分析
9.4程序流圖循環
9.4.1循環的基本概念
9.4.2支撐結點
9.4.3自然循環
9.4.4可歸約程序流圖
9.4.5基於文本的循環及其處理
9.5循環不變代碼外提
9.5.1代碼外提的基本概念
9.5.2循環不變代碼的判定
9.5.3循環不變代碼外提的條件
9.5.4基於文本循環和定值表的不變代碼外提
9.5.5一種簡單的外提優化方案
9.5.6別名分析
9.5.7過程與函數的副作用分析
9.6循環內歸納表達式的優化
9.6.1歸納變數
9.6.2歸納變數計算的優化演算法原理
練習
第10章目標代碼生成
10.1目標代碼
10.1.1虛擬機代碼
10.1.2目標機代碼
10.1.3窺孔優化
10.2臨時變數
10.2.1臨時變數的特點
10.2.2臨時變數的存儲空間
10.2.3臨時變數的存儲分配
10.2.4變數狀態描述
10.3寄存器
10.3.1寄存器分類及其使用准則
10.3.2寄存器分配單位
10.3.3寄存器狀態描述
10.3.4寄存器分配演算法
10.4基於三地址中間代碼的目標代碼生成
10.4.1目標地址生成
10.4.2間接目標地址的轉換
10.4.3表達式中間代碼的目標代碼生成
10.4.4賦值中間代碼的目標代碼生成
10.4.5其他寄存器分配法
10.4.6標號和goto語句中間代碼的目標代碼生成
10.4.7return中間代碼的目標代碼生成
10.4.8變數中間代碼的目標代碼生成
10.4.9函數調用中間代碼的目標代碼生成
10.5基於AST的代碼生成
10.5.1三地址中間代碼到AST的轉換
10.5.2標記需用寄存器個數
10.5.3從帶寄存器個數標記的AST生成代碼
10.6基於DAG的代碼生成
10.6.1從AST到DAG的轉換
10.6.2DAG排序和虛寄存器
10.6.3從帶序號和虛寄存器標記的DAG生成代碼
10.7代碼生成器的自動生成
10.7.1代碼生成器的自動化
10.7.2基於指令模板匹配的代碼生成技術
10.7.3基於語法分析的代碼生成技術
練習
第11章對象式語言的實現
11.1引言
11.2SOOL語法
11.2.1程序
11.2.2分程序
11.2.3類聲明
11.2.4類型
11.2.5變數聲明
11.2.6函數聲明和方法聲明
11.2.7語句
11.2.8變數
11.2.9表達式
11.2.10程序示例
11.3SOOL語義
11.3.1聲明的作用域
11.3.2Class聲明的語義
11.3.3語句的語義
11.4SOOL語義分析
11.4.1標識符的符號表項
11.4.2符號表結構
11.4.3符號表的局部化
11.5SOOL目標代碼
11.5.1對象空間
11.5.2當前對象——self
11.5.3活動記錄
11.5.4成員變數的目標地址
11.5.5表達式的目標代碼
11.5.6Offset原理
11.5.7類的多態性
11.5.8目標代碼區
11.5.9方法的動態綁定
11.5.10快速動態綁定目標代碼
主要參考文獻
㈥ 編譯原理問題,高手進。
回答下列問題:(30分)
(6分)對於下面程序段
program test (input, output)
var i, j: integer;
procere CAL(x, y: integer);
begin
y:=y*y; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end.
若參數傳遞的方法分別為(1)傳值、(2)傳地址,(3)傳名,請寫出程序執行的輸出結果。
答: (1) 3 (2) 16 (3) 16 (每個值2分)
(6分)計算文法G(M)的每個非終結符的FIRST和FOLLOW集合,並判斷該文法是否是LL(1)的,請說明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |
解答:
計算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}
檢查文法的所有產生式,我們可以得到:
1. 該文法不含左遞歸,
2. 該文法中每一個非終結符M,T,B,D的各個產生式的候選首符集兩兩不相交。
3. 該文法的非終結符T、B和D,它們都有候選式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以該文法不是LL(1)文法。(2分)
(4分)考慮下面的屬性文法
產 生 式 語 義 規 則
S→ABC
A→a
B→b
C→c B.u := S.u
A.u := B.v + C.v
S.v := A.v
A.v :=3*A.u
B.v := B.u
C.v := 1
畫出字元串abc的語法樹;
對於該語法樹,假設S.u的初始值為5,屬性計算完成後,S.v的值為多少。
答:(1) (2分)
(2) S.v的值為18 (2分)
(4分)運行時的DISPLAY表的內容是什麼?它的作用是什麼?
答:DISPLAY表是嵌套層次顯示表。每當進入一個過程後,在建立它的活動記錄區的同時建立一張嵌套層次顯示表diaplay.假定現在進入的過程層次為i,則它的diaplay表含有i+1個單元,自頂向下每個單元依次存放著現行層、直接外層、…、直至最外層(主程序,0層)等每層過程的最新活動記錄的起始地址。通過DISPLAY表可以訪問其外層過程的變數。
(5分)對下列四元式序列生成目標代碼:
A:=B*C
D:=E+A
G:=B+C
H:=G*D
其中,H在基本塊出口之後是活躍變數, R0和R1是可用寄存器。
答: 目標代碼序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H
(5分)寫出表達式a+b*(c-d)對應的逆波蘭式、三元式序列和抽象語法樹。
答:
逆波蘭式:(abcd-*+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) * b (1)
(3) + a (2)
抽象語法樹:(2分)
(8分)構造一個DFA,它接受={a,b}上所有包含ab的字元串。
答:
(2分)構造相應的正規式:(a|b)*ab(a|b)*
(3分)
a a
a b
b b
(3分)確定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a
a b b
b
最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}
(6分)寫一個文法使其語言為L(G)={anbncm| m,n≥1,n為奇數,m為偶數}。
答:
文法G(S):
(8分)對於文法G(S):
1. 寫出句型b(Ma)b的最右推導並畫出語法樹。
2. 寫出上述句型的短語,直接短語和句柄。
答:
1. (4分)
2. (4分)
短語: Ma), (Ma), b(Ma)b
直接短語: Ma)
句柄: Ma)
(12分)對文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 構造各非終結符的FIRSTVT和LASTVT集合;
(2) 構造算符優先表;
(3) 是算符優先文法嗎?
(4) 構造優先函數。
答:
(1) (4分)
(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >
(3) 是算符優先文法,因為任何兩個終結符之間至多隻有一種優先關系。 (1分)
(4) 優先函數(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3
(8分)設某語言的do-while語句的語法形式為
S do S(1) While E
其語義解釋為:
針對自下而上的語法分析器,按如下要求構造該語句的翻譯模式,將該語句翻譯成四元式:
(1) 寫出適合語法制導翻譯的產生式;
(2) 寫出每個產生式對應的語義動作。
答:(1). 適合語法制導翻譯的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2). (4分)
R do
{ R.QUAD:=NXQ }
UR S(1) While
{ U.QUAD:=R.QUAD;
BACKPATCH(S.CHAIN, NXQ) }
SU E
{ BACKPATCH(E.TC, U.QUAD);
S.CHAIN:=E.FC }
答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { M.QUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1).CHAIN, M2.QUAD);
BACKPATCH(E.TC, M1.QUAD);
S.CHAIN:=E. FC
}
(10分)將語句
while C>0 do if A B=0 then C:=C+D else C:=C*D
翻譯成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (*, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112
(10分)設有基本塊如下:
T1:=3
T2:=A*B
T3:=9+T1
M:=A*B
T4:=C-D
L:=T3*T4
T2:=C+D
N:=T2
畫出DAG圖;
設L,M,N 是出基本塊後的活躍變數,請給出優化後的四元式序列。
答:
1. (6分)
L
*
T2,M T4 T2,N
* - +
T1 T3
3 A B 12 C D
2. (4分)
M:=A*B
S1:=C-D
L:=12*S1
N:=C+D
(8分)文法G(S)及其LR分析表如下,請給出串baba#的分析過程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步驟 狀態 符號 輸入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估計認識!!
㈦ 在CSS樣式表中display是什麼意思啊
定義和用法
display 屬性規定元素應該生成的框的類型。旁吵
說明
這個屬性用於定義建立布局時元素生成的顯示框類型。對於 HTML 等文檔類型,如果使用 display 不謹慎會很危險,因為可能違反 HTML 中已經定義的顯示層次結構。對於 XML,由於 XML 沒有內置的這種層次結構,所有 display 是絕對必要的。
注釋:CSS2 中有值 compact 和 marker,不過由於缺乏廣泛的支持,已經從 CSS2.1 中去除了。
默認值: inline
繼承性: no
版本: CSS1
JavaScript 語法: object.style.display="inline"
實例
使段落生出行內框:
p.inline
{
display:inline;
}
TIY
瀏覽器支持
所有主流瀏覽器都支持 display 屬性。
注釋:任何版本的 Internet Explorer (包括 IE8)都不支持 "inherit"、"inline-table"、"run-in"、"table"、"table-caption"、"table-cell"、"table-column"、"table-column-group"、"table-row"、以及 "table-row-group" 屬性值。
可能的值
值 描述
none 此元素不會被顯示。
block 此元素將顯示為塊級元素,此元素前後會帶有換行符。
inline 默認。此元素會被顯示為內聯元運核侍素,元素前後沒有換行符。
inline-block 行內塊元素。(CSS2.1 新增的值)
list-item 此元素會作為列表顯示。
run-in 此元素會根據上下文作為塊級元素或內聯元素顯示。
compact CSS 中有值 compact,不過由於缺乏廣泛支持,已經從 CSS2.1 中刪除。
marker CSS 中有值 marker,不過由於缺乏廣泛支持,已經從 CSS2.1 中刪除。
table 此元素會作為塊級表格來顯示(類似 <table>),表格前後帶有換行符。
inline-table 此元素會作為內聯表格來顯示(類似 <table>),表格前後沒有換行符。
table-row-group 此元素會作為一個或多個行的分組來顯示(類似 <tbody>)。
table-header-group 此元素會作為一個或多個行的分組來顯示(類似 <thead>)。
table-footer-group 此元素會作為一個或多個氏型行的分組來顯示(類似 <tfoot>)。
table-row 此元素會作為一個表格行顯示(類似 <tr>)。
table-column-group 此元素會作為一個或多個列的分組來顯示(類似 <colgroup>)。
table-column 此元素會作為一個單元格列顯示(類似 <col>)
table-cell 此元素會作為一個表格單元格顯示(類似 <td> 和 <th>)
table-caption 此元素會作為一個表格標題顯示(類似 <caption>)
㈧ 如何理解CSS的display屬性
display屬性是我們在前端開發中常常使用的一個屬性,其中,最常見的有:
none
block
inline
inline-block
inherit
下面,我將按照順序將上述幾種屬性做一個完整的講解。
第一部分:display:none
none這個值表示此元素將不被顯示。比如,當我們在瀏覽網頁時,如果看到了某個煩人的廣告遮擋了我們的實現,更為可氣的是,它還沒有關閉的選項,這時(以chrome為例),我們就可以按下F12,打開開發者工具,點擊element,然後使用左上角的選擇工具選中想要刪除的廣告,可以看到element中會有高亮的一行或幾行代碼,右鍵,點擊Add Attribute,然後輸入:style="display:none",這時就可以發現廣告不見啦! 當然display:none的用法絕不是專門用於這里譽吵的,它還可以用於二級下拉菜單的製作中將二級下拉菜單先設置位display:none;,當滑鼠滑過一級菜單時,再顯示出來(詳見《如何實現導航菜單中的二級下拉菜單》)。還可以用於登陸模態框的製作等等。
第二部分:display:block
使用了display:block;之後, 此元素將顯示為塊級元素,此元素前後會帶有換行符。我們先來回顧以下塊級元素是什麼,他有什麼特點。
既然要區分塊級元素和行內元素,就得先說說標准文檔流了。標准文檔流:簡稱標准流,指的是在不使用其他的與排列和定位相關的css規則時,各種元素的排列規則。於是,我們將「各種元素」分為塊級元素和行內元素。(註:實際上還有空元素,如<br>用於換行,<hr>為一條水平線,這里對空元素不做過多討論)
塊級元素特點:
總是以一個塊的形式表現出來,佔領一整行。若干同級塊元素會從上之下依次排列(使用float屬性除外)。
可以設置高度、寬度、各個方向外補丁(margin)以及各個方向的內補丁(padding)。
當寬度(width)預設時,它的寬度時其容器的100%,除非我們給它設定了固定的寬度。
塊級元素中可以容納其他塊級元素或行內元素。
常見的塊級元素由<p><div><h1><li>等等。
塊級元素的display屬性值默認為block。
行內元素特點:
它不會單獨占據一整行,而是只佔領自身的寬度和高度所在的空間。若干同級行內元素會從左雀培到右(即某個行內元素可以和其他行內元素共處一行),從上到下依次排列。
行內元素不可以設置高度、寬度,其高度一般由其字體的大小來決定,其寬度由內容的長度控制。
行內元素只能設置左右的margin值和左右的padding值,而不能設置上下的margin值和上下的padding值。因此我們可以通過設置左右的padding值來改變行內元素的寬度。
常見的行內元素由<a><em><img>等等。
行內元素一般不可以包含塊級元素。
塊級元素的display屬性值默認為inline。
ok!簡單回顧了塊級元素和行內元素之後,我們就可以進行下一步講解了。
通過對一個行內元素設置display:block;可以將行內元素設置為塊級元素,進而設置它的寬高和上下左右的padding和margin。
應用:
如果我們經常會製作導航欄,這時就要使用ul li 和a組合的方式,但是<a>是行內元素,我們無法設置它的寬和高,這時,就可以在<a>的樣式表中,將之設置為display:block。這樣就可以設置它的寬和高,以及上下左右的margin和padding以達頃虛唯到我們想要的效果了。
㈨ 嵌套層次顯示表display的作用
嵌套層次顯示表
由於過程嵌套允許內層過程首哪明引用外層過程定義的數據,因此,當一個過程運行時必須跟者告蹤它的所有外層過程緩正的最新活動記錄起始地址, display表就是用於登記每個外層過程的最新活動記錄起始地址。
㈩ 在CSS樣式表中display是什麼意思
display 屬性規定元素應該生成的框的類型,用的最多的就是display:block;顯示 display:none;隱藏。下面是所有值的用法描述。display本身意思是「顯示、陣列」的意思x0dx0a值 描述x0dx0ax0dx0anone 此元素不會被顯示。 x0dx0ablock 此元素將顯示為塊級元素,此元素前後會帶有換行符。 x0dx0ainline 默認。此元素會被顯示為內聯元素,元素前後沒有換行符。 x0dx0ainline-block 行內塊元素。(CSS2.1 新增的值) x0dx0alist-item 此元素會作為列表顯示。 x0dx0arun-in 此元素會根據上下文作為塊級元素或內聯元素顯示。 x0dx0acompact CSS 中有值 compact,不過由於缺乏廣泛支持,已經從 CSS2.1 中刪除。 x0dx0amarker CSS 中有值 marker,不過由於缺乏廣泛支持,已經從 CSS2.1 中刪除。 x0dx0atable 此元素會作為塊級表格來顯示(類似
和 | ) x0dx0atable-caption 此元素會作為一告坦個表格標題顯示(類似 熱點內容
|
---|