編譯原理表達式
❶ 編譯原理三元式a:=0怎麼樣表示呢
一.(15分)有表達式如下:A+B*(C-D)**N (**為冪乘) (1)給出該表達式的逆波蘭式表示(後綴式); (2)給出上述表達式的四元式和三元式序列. 一起考研社區真情奉獻 二.(15分)有C程序如下: main() { printf("%d,%d,%d\n",10); } (1)試著寫出上述printf語句輸出的結果; (2)從運行環境和printf的實現分析為什麼會有這樣的輸出結果. www.17ky.cn獨家資料 三.(5分)構造一個DFA(確定的有限自動機),使之接受含偶數個"1"的0,1串集. www.17ky.cn會員奉獻 四.(5分)有文法G,其產生式如下: S->S(S), S->ε /*空產生式*/ 試寫出一個語法制導定義,它輸出配對的括弧個數. www.17ky.cn獨家提供 五.(10分)已知某語言L={a^(m)b^(n)|n>m>=0}.試寫出產生該語言的兩個文法G1和 G2,其中G1是LR(1)文法,G2是非LR(1)和非二義性文法. 更多考研真題,請光臨www.17ky.cn 六.填空(每空一分,共20分) 1.現代操作系統的兩個最基本的特徵是___和___. 2.進程式控制制塊的初始化工作包括___,___和___. 3.在操作系統中引入線程概念的主要目的是___. 4.unix系統v中,系統向用戶提供的用於創建新進程的系統調用是___;用於建立無名 管道的系統調用是___;用於創建有名管道的系統調用是___. 5.unix系統v中,引起進程調度的原因有___,___,___和___等. 6.在分區分配演算法中,首次適應演算法傾向於優先利用內存中___部分的空閑分區,從 而保留了___部分的大空閑區. 7.進行設備分配時所需的數據表格主要有___,___,___和___等. 8.利用符號鏈實現文件共享時,對文件主刪除了共享文件後造成的指針懸空問題,解 決的方法是___. 更多考研真題,請光臨www.17ky.cn 七.(8分)在消息傳遞通信方式下, A.發送進程和接收進程在通信過程中可以採用那三種同步方式? B.試以下面給出的發送進程和接收進程(將接收到的數據存入S)為例,說明當接收進 程執行到標號為L2的語句時,採用這三種同步方式,X的值可能各是多少? 一起考研社區真情奉獻 發送進程P: 接收進程Q: M=10; L1: send M to Q; L1: receive S from P; L2: M=20; L2: X:=S+1; goto L1; 更多考研真題,請光臨www.17ky.cn 八.(8分)一系統具有150個存儲單元,在T0時刻按下表所示分配給3個進程: 進程Maximum demand Current allocation P1 70 25 P2 60 40 P3 60 45 對下列請求應用銀行家演算法分析判定是否是安全的: A.第4個進程P4到達,最大需求60個存儲單元,當前請求分配25個單元. B.第4個進程P4到達,最大需求50個存儲單元,當前請求分配35個單元. 如果是安全的請給出一個可能的進程安全執行序列.如果是不安全的,請說明原因. 更多考研真題,請光臨www.17ky.cn 九、(14分)設正在處理器上執行的一個進程的頁表如下.頁表的虛頁號和物理塊號 是十進制數,起始頁號(塊號)均為0.所有的地址均是存儲器位元組地址,頁的大小為 1024位元組. A.詳述在設有快表的請求分頁存儲管理系統中,一個虛地址轉換成物理內存地址的過程. B.下列虛地址對應與什麼物理地址: (1)5499; (2) 2221; 虛頁號 狀態位 訪問位 修改位 物理塊號 0 1 1 0 4 1 1 1 1 7 2 0 0 0 --- 3 1 0 0 2 4 0 0 0 --- 5 1 0 1 0 www.17ky.cn獨家提供 注釋:訪問位---當某頁被訪問時,其訪問位被置為1. www.17ky.cn考研人的成功俱樂部 編譯原理與操作系統 參考答案 一. (1)後綴式:ABCD-*+ECD-N**/+ (2) 四元式 三元式 (1)( - , C , D , t1) (1)( - , C , D ) (2)( * , B , t1, t2) (2)( * , B ,(1)) (3)( +, A , t2, t3) (3)( +, A ,(2)) (4)( - , C , D, t4) (4)( - , C , D ) (5)(**, t4, N , t5) (5)(**, (4), N) (6)( / , E , t5, t6) (6)( / ,E ,(5)) (7)( +, t3, t6, t7) (7)( +,(3),(6))
❷ 編譯原理 寫出表達式 三元序列
三元式
(1)(a,b,+)
(2)(a,b,-)
(3)((1),(2),/)
(4)(b,c,*)
(5)(a,(4),+)
(6)((3),(5),-)
四元式
(a,b,+,x1)
(a,b,-,x2)
(x1,x2,/,x3)
(b,c,*,x4)
(a,x4,+,x5)
(x3,x5,-,x6)
❸ 編譯原理正則表達式化簡
你好,語言L={a}{a,b}∗({ϵ}∪({.,_}{a,b}{a,b}∗))L={a}{a,b}
∗
({ϵ}∪({.,_}{a,b}{a,b}
∗
))
這個語言是指,由a開頭,後接任意長度的a、b串,然後再接空串(代表結束)。或者是接以.或_開頭的,後接長度大於等於1的a、b串。
正則表達式(Regular Expression, RE)是一種用來描述正則語言的更緊湊的表示方法。
❹ 【編譯原理】構造下述文法G[S]的確定有限自動機,並給出該文法的語言的正規表達式 S->Aa|ε A->Aa|Sb|a
通過聯立方程組求正規表達式:
A = Aa|Sb|a = Aa|(Aa|ε)b|a= Aa+(Aa+ε)b+a=Aa+(Aab+b)+a=Aa+Aab+b+a=A(a+ab)+(b+a)
根據方程X=Xt+r 必有X=t*r解的論斷,可得A=(a+ab)*(b+a),進而可求得:
S = Aa|ε = Aa+ε = Aa = (a+ab)*(b+a)a = (a|ab)*(b|a)a
即文法的正規表達式為: (a|ab)*(b|a)a。
注意:以上求解的過程中「|」和「+」是等價的,都表示「或」的意思,它們的相互替換是為了描述的方便。
❺ 編譯原理 對於輸入的任一算術表達式
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define DEBUG
#define NULL 0
#define ERROR -1
#define STACKSIZE 20
/* 定義字元類型棧 */
typedef struct{
char stackname[20];
char *base;
char *top;
} Stack;
/* ----------------- 全局變數--------------- */
Stack OPTR, OPND; /* 定義前個運算符棧,後個操作數棧 */
char expr[255] = ""; /* 存放表達式串 */
char *ptr = expr;
int step = 0; /* 計算的步次 */
int InitStack(Stack *s, char *name)
{
s->base=(char *)malloc(STACKSIZE*sizeof(char));
if(!s->base) exit (ERROR);
strcpy(s->stackname, name);
s->top=s->base;
return 1;
}
int In(char ch)
{
return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
void OutputStatus(void)
{
char *s;
/* step */
printf("\n%-8d", ++step);
/* OPTR */
for(s = OPTR.base; s < OPTR.top; s++)
printf("%c", *s);
printf("\t");
/* OPND */
for(s = OPND.base; s < OPND.top; s++)
printf("%d ", *s);
/* input char */
printf("\t\t%c", *ptr);
}
int Push(Stack *s,char ch)
{
#ifdef DEBUG
char *name = s->stackname;
OutputStatus();
if(strcmp(name, "OPND") == 0)
printf("\tPUSH(%s, %d)", name, ch);
else
printf("\tPUSH(%s, %c)", name, ch);
#endif
*s->top=ch;
s->top++;
return 0;
}
char Pop(Stack *s)
{
char p;
#ifdef DEBUG
OutputStatus();
printf("\tPOP(%s)", s->stackname);
#endif
s->top--;
p=*s->top;
return (p);
}
char GetTop(Stack s)
{
char p=*(s.top-1);
return (p);
}
/* 判斷運算符優先權,返回優行權高的 */
char Precede(char c1,char c2)
{
int i=0,j=0;
static char array[49]={ '>', '>', '<', '<', '<', '>', '>',
'>', '>', '<', '<', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'<', '<', '<', '<', '<', '=', '!',
'>', '>', '>', '>', '!', '>', '>',
'<', '<', '<', '<', '<', '!', '='};
switch(c1)
{
/* i為下面array的橫標 */
case '+' : i=0;break;
case '-' : i=1;break;
case '*' : i=2;break;
case '/' : i=3;break;
case '(' : i=4;break;
case ')' : i=5;break;
case '#' : i=6;break;
}
switch(c2)
{
/* j為下面array的縱標 */
case '+' : j=0;break;
case '-' : j=1;break;
case '*' : j=2;break;
case '/' : j=3;break;
case '(' : j=4;break;
case ')' : j=5;break;
case '#' : j=6;break;
}
return (array[7*i+j]); /* 返回運算符 */
}
/*操作函數 */
int Operate(int a,char op,int b)
{
#ifdef DEBUG
OutputStatus();
printf("\tOPERATE(%d, %c, %d)", a, op, b);
#endif
switch(op)
{
case '+' : return (a+b);
case '-' : return (a-b);
case '*' : return (a*b);
case '/' : return (a/b);
}
return 0;
}
int EvalExpr(void)
{
char c,theta,x,m,ch;
int a,b;
c = *ptr++;
while(c!='#'||GetTop(OPTR)!='#')
if(!In(c))
{
m=atoi(&c);
Push(&OPND,m);
c = *ptr++;
}
else
switch(Precede(GetTop(OPTR),c))
{
case '<':
Push(&OPTR,c);
c = *ptr++;
break;
case '=':
x=Pop(&OPTR);
c = *ptr++;
break;
case '>':
theta=Pop(&OPTR);
b=Pop(&OPND); a=Pop(&OPND);
Push(&OPND,Operate(a,theta,b));
break;
}
return GetTop(OPND);
}
int main(void)
{
/*
printf("Input the expression(end with \"#\" sign):");
do{
gets(expr);
}while(!*expr); */
//strcpy(expr, "2*(2+3)#");
char *pc;
printf("Input the expression(end with \"#\" sign):");
gets(expr);
pc=expr;
if(expr[0]=='\0')
{
printf("Please input a valid expression!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
else
{
while(*pc!='\0')
pc++;
pc--;
if(*pc!='#')
{
printf("Please asure the expression end with \"#\" sign!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
}
InitStack(&OPTR, "OPTR"); /* 初始化運算符棧 */
Push(&OPTR,'#'); /* 將#壓入運算符棧 */
InitStack(&OPND, "OPND"); /* 初始化操作數棧 */
printf("\n\nresult:%d\n", EvalExpr());
system("pause");
return 0;
}
❻ 編譯原理,正則表達式的低級基礎問題
1、正則表達式:0(0|1)*1
2、由於不方便畫圖,最簡DFA用狀態表表示如下:
(1)開始狀態S------輸入0------->狀態A
(2)狀態A-------輸入0-------->狀態A
(3)狀態A-------輸入1-------->狀態B(可接受狀態)
(4)狀態B-------輸入0-------->狀態A
(5)狀態B-------輸入1-------->狀態B(可接受狀態)
❼ 編譯原理四元式
四元式的一般形式為(op, arg1, arg2, result),其中:op為一個二元(也可以是零元或一元)運算符。arg1和arg2為兩個運算對象,可以是變數、常數或者系統定義的臨時變數名。result為運算結果。
第一步:T1=a*b,
第二步:T2=c*d,
第三步:T3=T2/e,
第四步:T4=T1-T3,
第五步:f=T4.