狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

實驗報告的實驗原理怎么寫范文(通用3篇)

| 瀏覽次數:

原理,漢語詞語,拼音是yuán lǐ,意思是具有普遍意義的最基本的規律, 以下是為大家整理的關于實驗報告的實驗原理怎么寫3篇 , 供大家參考選擇。

實驗報告的實驗原理怎么寫3篇

實驗報告的實驗原理怎么寫篇1

實驗十九 濾波法及數字鎖相環法位同步提取實驗

一、實驗目的

1、掌握濾波法提取位同步信號的原理及其對信息碼的要求。

2、掌握用數字鎖相環提取位同步信號的原理及其對信息代碼的要求。

3、掌握位同步器的同步建立時間、同步保持時間、位同步信號同步抖動等概念。

二、實驗器材

1、主控&信號源、13、8號模塊 各一塊

2、雙蹤示波器 一臺

3、連接線 若干

三、實驗原理

1、濾波法位同步提取實驗原理框圖

濾波法位同步提取實驗框圖

2、濾波法位同步提取實驗框圖說明

將單刀雙擲開關S2上撥,選擇濾波法位同步提取電路,輸入HDB3單極性碼信號經一個256K窄帶濾波器,濾出同步信號分量,通過門限判決后提取位同步信號。但由于有其他頻率成分的干擾,導致時鐘有些部分的占空比不為50%,因此需要通過模擬鎖相環進行平滑處理;數字的256K時鐘經過4分頻之后,已經得到一定的平滑效果,送入CD4046鑒相輸入A腳的是64KHz的時鐘信號,當CD4046處于同步狀態時,鑒相器A腳的時鐘頻率及相位應該與鑒相器B腳的相同。由于鑒相器B腳的時鐘是VCO經8分頻得到的。因此,VCO輸出的頻率為512K。

3、數字鎖相環法位同步提取實驗原理框圖

word/media/image2_1.png

數字鎖相環位同步提取實驗原理框圖

4、數字鎖相環法位同步提取實驗框圖說明

鎖相法位同步提取是在接收端利用鎖相環電路比較接收碼元和本地產生的位同步信號的相位,并調整位同步信號的相位,最終獲得準確的位同步信號。4位撥碼開關S3設置BCD碼控制分頻比,從而控制提取的位同步時鐘頻率,例如設置分頻頻率“0000”輸出4096KHz頻率,“0011”輸出512KHz頻率,“0100”輸出256KHz頻率,“0111”輸出32KHz頻率。。

數字鎖相環(DPLL)是一種相位反饋控制系統。它根據輸入信號與本地估算時鐘之間的相位誤差對本地估算時鐘的相位進行連續不斷的反饋調節,從而達到使本地估算時鐘相位跟蹤輸入信號相位的目的。DPLL 通常有三個組成模塊: 數字鑒相器(DPD)、數字環路濾波器(DLF)、 數控振蕩器(DCO)。根據各個模塊組態的不同, DPLL 可以被劃分出許多不同的類型。根據設計的要求,本實驗系統采用超前滯后型數字鎖相環(LL-DPLL)作為解決方案。在LL- DPLL中,DLF 用雙向計數邏輯和比較邏輯實現,DCO 采用“加”、“扣”脈沖式數控振蕩器。這樣設計出來的DPLL具有結構簡潔明快,參數調節方便,工作穩定可靠的優點。DPLL實現框圖如下:

word/media/image3_1.png

數字鎖相環框圖

下面就對數字鎖相環的各個組成模塊的詳細功能、內部結構以及對外接口信號進行說明:

①超前-滯后型數字鑒相器

與一般DPLL 的DPD的設計不同,位同步DPLL 的DPD需要排除位流數據輸入連續幾位碼值保持不變的不利影響。LL-DPD為二元鑒相器,在有效的相位比較結果中僅給出相位超前或相位滯后兩種相位誤差極性, 而相位誤差的絕對大小固定不變。LL-DPD通常有兩種實現方式: 微分型LL-DPD和積分型LL-DPD。積分型LL-DPD具有優良的抗干擾性能,而它的結構和硬件實現都比較復雜。微分型LL- DPD 雖然抗干擾能力不如積分型LL-DPD, 但是結構簡單,硬件實現比較容易。本實驗采用微分型LL-DPD, 將環路抗噪聲干擾的任務交給DLF模塊負責。

word/media/image4_1.png

LL-DPD模塊內部結構與對外接口信號

如圖所示,LL-DPD在ClkEst跳變沿(含上升沿和下降沿)處采樣DataIn上的碼值, 寄存在Mem中。在ClkEst下降沿處再將它們對應送到兩路異或邏輯中,判斷出相位誤差信息并輸出。Sign 給出相位誤差極性,即ClkEst相對于DataIn是相位超前(Sign=1)還是滯后(Sign=0)。AbsVal 給出相位誤差絕對值:若前一位數據有跳變,則判斷有效,以AbsVal輸出1表示;否則,輸出0表示判斷無效。 下圖顯示了LL-DPD模塊的仿真波形圖。

LL-DPD模塊輸入輸出關系仿真波形圖

②數字環路濾波器(DLF)

DLF用于濾除因隨機噪聲引起的相位抖動,并生成控制DCO 動作的控制指令。本實驗實現的DLF內部結構及其對外接口信號如下圖所示。

DLF模塊內部結構與對外接口信號

濾波功能用加減計數邏輯CntLgc實現,控制指令由比較邏輯CmpLgc生成。在初始時刻,CntLgc被置初值M/2。前級LL-DPD模塊送來的相位誤差PhsDif在CntLgc中作代數累加。在計數值達到邊界值0或M后,比較邏輯CmpLgc將計數邏輯CntLgc同步置回M/2,同時相應地在Deduct或Insert引腳上輸出一高脈沖作為控制指令。隨機噪聲引起的LL-DPD相位誤差輸出由于長時間保持同一極性的概率極小,在CntLgc中會被相互抵消,而不會傳到后級模塊中去,達到了去噪濾波的目的。計數器邏輯CntLgc的模值M 對DPLL的性能指標有著顯著地影響。加大模值M,有利于提高DPLL的抗噪能力,但是會導致較大的捕捉時間和較窄的捕捉帶寬。減小模值M 可以縮短捕捉時間,擴展捕捉帶寬,但是降低了DPLL的抗噪能力。根據理論分析和調試實踐,確定M為1024,圖中計數器數據線寬度w可以根據M確定為10。

③數控振蕩器(DCO)

DCO的主要功能是根據前級DLF模塊輸出的控制信號Deduct和Insert生成本地估算時鐘ClkEst,這一時鐘信號即為DPLL恢復出來的位時鐘。同時,DCO還產生協調DPLL內各模塊工作的時鐘,使它們能夠協同動作。要完成上述功能,DCO 應有三個基本的組成部分:高速振蕩器(HsOsc)、相位調節器(PhsAdj)、分頻器(FnqDvd),如下圖所示。

DCO模塊內部結構與對外接口信號

高速振蕩器(HsOsc)提供高速穩定的時鐘信號Clk,該時鐘信號有固定的時鐘周期,周期大小即為DPLL 在鎖定狀態下相位跟蹤的精度,同時,它還影響DPLL 的捕捉時間和捕捉帶寬??紤]到DPLL 工作背景的要求,以及盡量提高相位跟蹤的精度以降低數據接收的誤碼率,取HsOsc輸出信號Clk頻率為所需提取位時鐘信號的16倍。若取HsOsc輸出信號Clk64MHz的周期為15.625ns,即高速振蕩器HsOsc的振蕩頻率為64MHz。

PhsAdj在控制信號Deduct和Insert上均無高脈沖出現時,僅對Osc輸出的時鐘信號作4分頻處理,從而產生的Clk16MHz時鐘信號將是嚴格16MHz 的。當信號Deduct 上有高脈沖時,在脈沖上升沿后,PhsAdj會在時鐘信號Clk16MHz的某一周期中扣除一個Clk64Mhz時鐘周期,從而導致Clk16MHz時鐘信號相位前移。當在信號Insert上有高脈沖時,相對應的處理會導致Clk16MHz時鐘信號相位后移。下圖為相位調節器單元經功能編譯仿真后的波形圖。

word/media/image8_1.png

DCO模塊相位調節器PhsAdj單元輸入輸出關系

引入分頻器FnqDvd的目的主要是為DPLL中DLF模塊提供時鐘控制,協調DLF與其它模塊的動作。分頻器FnqDvd用計數器實現,可以提供多路與輸入位流數據有良好相位同步關系的時鐘信號。在系統中,分頻器FnqDvd提供8路輸出ClksSyn[7..0]。其中,ClksSyn1即為本地估算時鐘ClkEst,也即恢復出的位時鐘;ClksSyn0即為DLF模塊的計數時鐘ClkCnt,其速率是ClkEst的兩倍,可以加速計數,縮短DPLL 的捕捉時間,并可擴展其捕捉帶寬。

四、實驗步驟

實驗項目一 濾波法位同步電路帶通濾波器幅頻特性測量。

概述:該項目是通過改變輸入信號的頻率,觀測信號經濾波后對應輸出幅度,從而了解并繪制濾波器的幅頻特性。

1、關電,按表格所示進行連線。

2、開電,設置主控,選擇【信號源】→【輸出波形】。設置輸出波形為正弦波,調節相應旋鈕,使其輸出頻率為200KHz,峰峰值3V。

3、此時系統初始狀態為:輸入信號為頻率200KHz、幅度3V的正弦波。

4、實驗操作及波形觀測。

分別觀測13號模塊的“濾波法位同步輸入”和“BPF-Out”,改變信號源的頻率,測量“BPF-Out”的幅度填入下表,并繪制幅頻特性曲線。

實驗項目二 濾波法位同步恢復觀測

概述:該項目是通過比較和觀測濾波法位同步電路中各點幅度及相位,探討濾波法位同步的提取原理以及影響因素。

1、關電,按表格所示進行連線。

2、開電,設置主控菜單,選擇【信號源】→【通信原理】→【濾波法及數字鎖相環位同步法提取】。將13號模塊S2撥上。將S4撥為1000。

3、此時系統初始狀態為:輸入PN為256K。

4、實驗操作及波形觀測。

(1)以“BPF-Out”為觸發,觀測“門限判決輸出”,記錄波形。

思考:分析在什么情況下門限判決輸出的時鐘會不均勻,為什么?

(2)以“BPF-Out”為觸發,觀測“鑒相輸入1”,記錄波形。

(3)對比“門限判決輸出”和“鑒相輸入1”的波形。

思考:分析時鐘不均勻的情況是否有所改善。

(4)對比觀測“鑒相輸入1”和“鑒相輸入2”,記錄波形。比較兩路波形的幅度和相位。

(5)對比觀測“濾波法位同步輸入”和“BS1”,觀測恢復的位同步信號。

實驗項目三 數字鎖相環法位同步觀測

概述:該項目是通過比較和觀測數字鎖相環位同步電路中各點相位超前、延時以及抖動情況,探討數字鎖相環法位同步的提取原理。

1、關電,按表格所示進行連線。

2、開電,設置主控菜單,選擇【信號源】→【通信原理】→【濾波法及數字鎖相環位同步法提取】。

3、此時系統初始狀態為: PN碼速率256K。

4、實驗操作及波形觀測。

(1)觀測13模塊的“數字鎖相環輸入”和“輸入跳變指示”。觀測當“數字鎖相環輸入”沒有跳變和有跳變時“輸入跳變指示”的波形。

(2)觀測13模塊的“數字鎖相環輸入”和“鑒相輸出”。觀測相位超前滯后的情況。

(3)觀測13模塊的“插入指示”和“扣除指示”。

思考:分析波形有何特點,為什么出現這種情況。

(4)以信號源模塊的“CLK”為觸發,觀測13號模塊的“BS2”。

思考:BS2恢復的時鐘是否有抖動的情況,為什么?試分析BS2抖動的區間有多大?如何減小這個抖動的區間?

五、實驗報告

1、對實驗思考題加以分析,按照要求做出回答,并嘗試畫出本實驗的電路原理圖。

2、結合實驗波形分析數字鎖相環原理。

實驗報告的實驗原理怎么寫篇2

微機原理

實驗報告

學校:湖北文理學院、

班級:電子1413

姓名:楊仕浩

學號:2014111347

指導老師:吉向東

實驗一兩個多位十進制數相加的實驗

一、實驗目的

學習數據傳送和算術運算指令的用法

熟悉在PC機上建立、匯編、鏈接、調試和運行匯編語言程序的過程。

二、實驗內容

將兩個多位十進制數相加,要求被加數和加數均以ASCII碼形式各自順序存放在以DATA1、DATA2為首的5個內存單元中(低位在前),結果送回DATA1處。

三、程序框圖

四、實驗程序清單

DATA SEGMENT

DATA1 DB 33H,39H,31H,37H,34H;被加數

DATA1END EQU $-1

DATA2 DB 34H,35H,30H,38H,32H;加數

DATA2END EQU $-1

SUM DB 5 DUP(?)

DATA ENDS

STACK SEGMENT

STA DB 20 DUP(?)

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV AX,TOP

MOV SP,AX

MOV SI,OFFSET DATA1END

MOV DI,OFFSET DATA2END

CALL ADDA

MOV AX,4C00H

INT 21H

ADDA PROC NEAR

MOV DX,SI

MOV BP,DI

MOV BX,05H

AD1: SUB BYTE PTR [SI],30H

SUB BYTE PTR [DI],30H

DEC SI

DEC DI

DEC BX

JNZ AD1

MOV SI,DX

MOV DI,BP

MOV CX,05H

CLC

AD2: MOV AL,[SI]

MOV BL,[DI]

ADC AL,BL

AAA

MOV [SI],AL

DEC SI

DEC DI

LOOP AD2

MOV SI,DX

MOV DI,BP

MOV BX,05H

AD3: ADD BYTE PTR [SI],30H

ADD BYTE PTR [DI],30H

DEC SI

DEC DI

DEC BX

JNZ AD3

RET

ADDA ENDP

CODE ENDS

END START

5、實驗結果

6、實驗結果分析

7、實驗心得體會

經過這次實驗我學會了如何使用命令提示符,并學會了如何用命令提示符運行指令

8、在本次試驗中完成了兩個兩位十進制數的相加,了解了數據傳送和算術運算指令的使用方法。

實驗二排序實驗

一、實驗目的

掌握用匯編語言編寫排序程序的思路和方法。

二、實驗內容

將指定內存出開始的數據按從大到小的順序排列。第一個數字表示數據的個數。

三、程序流程圖

圖 3-2

四、程序清單

DATA SEGMENT

ADDR DW 8,234,35,67,876,54,39,765,237

DATA ENDS

STACK SEGMENT

STA DW 32 DUP(?)

TOP DW ?

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

MOV SP,TOP

MOV CX,WORD PTR ADDR[0]

DEC CX

LOOP1: MOV DI,CX

MOV BX,2

LOOP2: MOV AX,WORD PTR ADDR[BX]

CMP AX,WORD PTR ADDR[BX+2]

JGE CCC

XCHG AX,WORD PTR ADDR[BX+2]

MOV WORD PTR ADDR[BX],AX

CCC: ADD BX,2

LOOP LOOP2

MOV CX,DI

LOOP LOOP1

EXIT: MOV AX,4C00H

INT 21H

CODE ENDS

END START

5、實驗結果

6、實驗結果分析

七、實驗心得體會

實驗三自編程序上機調試

一、實驗目的

掌握用匯編語言編寫程序的思路和方法。

二、實驗內容

選作業題中題目上機調試。

三、程序框圖

N

N

Y

N

Y

四、程序清單

DSEG SEGMENT

ARY DW 4,9,2,8,6

N DW 5

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG

START: MOV AX,DSEG

MOV DS,AX

MOV CX,N

DEC CX

LOOP1: MOV DI,CX

MOV BX,0

LOOP2: MOV AX,ARY[BX]

CMP AX,ARY[BX+2]

JGE COTINUE

XCHG AX,ARY[BX+2]

MOV ARY[BX],AX

COTINUE:ADD BX, 2

LOOP LOOP2

MOV CX, DI

LOOP LOOP1

MOV AH, 4CH

INT 21H

CSEG ENDS

END START

五、實驗結果

6、實驗結果分析

7、實驗心得與體會

實驗四自編程序上機調試

一、實驗目的

掌握用匯編語言編寫程序的思路和方法。

二、實驗內容

選作業題中題目上機調試。

三、程序流程圖

四、程序清單

STACK SEGMENT STACK

DB 10 dup(?)

STACK ENDS

DATA SEGMENT

X DW 8326H

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE, DS: DATA, SS:STACK

START: MOV AX, DATA

MOV DS, AX

MOV AX, X

AND AX, AX

JNS DONE

NEG AX

DONE: MOV X, AX

MOV AH, 4CH

INT 21H

CODE ENDS

END START

8、實驗結果分析

9、實驗心得與體會

實驗五 8255并行I/O口實驗

一、實驗要求

利用8255可編程并行口芯片,實現輸入/輸出實驗,實驗中用8255PA口作輸入,PB口作輸出。

二、實驗目的

1、了解8255芯片結構及編程方法。

2、了解8255輸入/輸出實驗方法。

三、預備知識

8255是Intel公司生產的與Intel8080/8085系列的MPU配套的可編程外圍接口電路,簡稱PPI。它有A、B、C三個八位端口寄存器,通過24位端口線與外部設備相連,基中C口可分為上半部和下半部。這24根端口線全部為雙向三態。三個端口可分二組來使用,可分別工作于三種不同的工作方式。

四、實驗原理圖及連線

1、本實驗主要用到的模塊:8255模塊、開關量輸出模塊、0-1指示模塊、實驗譯碼單元等;

2、PA0-PA7分別接開關量輸出模塊S0-S7對應的插座;

3、PB0-PB7分別接0-1指示模塊DO71-DO78對應的插座;

4、8255A的片選/CS接地址譯碼單元的2A0-2A7;

5、數據線XD0—XD7接系統數據線區的任一插座。

圖 3-3

五、實驗內容

將實驗的線路連接好后,編程,將8255的A口作為輸入,輸入信號由8個邏輯電平開關提供,B口作為輸出,其內容由發光二極管來顯示。

六、程序清單

L8255_CMD EQU 2A3H

L8255_PA EQU 2A0H

L8255_PB EQU 2A1H

L8255_PC EQU 2A2H

CODE SEGMENT

ASSUME CS:CODE,DS:CODE

BEGIN:

MOV CX,0FFH

AA: LOOP AA

MOV DX,L8255_CMD

MOV AL,9CH ;10011000

OUT DX,AL

NOP

NOP

NOP

NOP

NOP

BB: MOV DX,L8255_PA

IN AL,DX

XOR AL,0FFH

MOV DX,L8255_PB

OUT DX,AL

JMP BB

CODE ENDS

END BEGIN

七、程序框圖

圖 3-4

八、實驗步驟

1、參照圖中的內容連好線;

2、運行上位機軟件,裝載并運行相應程序即可(聯機請參考程序8255.asm)。

注意:同學們自己編寫程序時,8255的/CS連線可以接地址譯碼單元的其他信號,其它連線相同。如果用的端口與本實驗不一樣,也可以改變IO口的連線。

九、儀器配置
ZY15MicInt12BB微機原理及接口實驗箱 一臺。

十、實驗現象

當讀到某個開關處于高電平時,對應的發光二極管就會亮

十一、思考題

根據程序列出實驗中8255的各個端口的地址,如果8255的/CS改接譯碼信號280H,其它信號不變,那么對應的端口地址又是多少?

實驗六 ADC0809A/D轉換實驗

一、實驗目的

1、加深理解逐次逼近法模數轉換器的特征和工作原理;

2、掌握A/D轉換芯片與8088/86的接口方法;

3、了解A/D芯片ADC0809轉換性能及編程方法。

二、預備知識

A/D轉換器大致有三類:一是雙積分A/D轉換器,優點是精度高,抗干擾性好;價格便宜,但速度慢;二是逐次逼近A/D轉換器,精度,速度,價格適中;三是并行A/D轉換器,速度快,價格也昂貴。

實驗用的ADC0809屬第二類,是八位A/D轉換器。每采集一次一般需100us。本程序是用延時查詢方式讀入A/D轉換結果,也可以用中斷方式讀入結果,在中斷方式下,A/D轉換結束后會自動產生EOC信號,做為轉換完成的信號。

三、實驗原理說明及連線

1、本實驗的位置在實驗箱的“ADC0809模塊”;

2、本實驗用芯片ADC0809的片選地址為2B8H,實驗箱上已固定好,不需要再連線;

3、將該實驗模塊的CLOCK和“信號源模塊”的1MHz信號連接起來;

4、用排線將“系統數據總線輸出單元”中的任意一組數據線和本實驗模塊的“ADC0809:XD0-XD7”連接起來;

5、將通道0模擬量輸入端IN0接模擬信號產生電路模塊中的電位器R093的中心抽頭,然后將R093的兩端一端接地,另一端接VCC(+5V)。

圖 3-8

四、實驗內容

利用電位器輸出一個幅值可調的直流電壓信號,送入ADC0809的通道0,將轉換后的結果在屏幕上顯示出來,并驗證它與輸入電壓的關系。

五、實驗步驟

1、確認連接好線路;

2、裝載運行程序。

六、實驗框圖

圖 3-9

七、儀器配置
ZY15MicInt12BB微機原理及接口實驗箱 一臺

八、實驗現象

當用戶扭動電阻器時,屏幕將顯示相應的數值。

九、思考題

按圖中的連接線路,輸入一個3V的模擬信號,輸出的數字信號的理論值是多少,在實驗箱上驗證該值的正確性。

實驗中用的ADC0809的IN0的地址是什么?

十、程序清單

CODE SEGMENT

ASSUME CS:CODE

START:

MOV DX,2B8H ;2B0H-2B7H

MOV AL,00H

OUT DX,AL

CALL DELAY

IN AL,DX

CALL SHOW

CALL DELAY

JMP START

SHOW PROC NEAR

PUSH DX

PUSH AX

MOV CL,4

SHR AL,CL

AND AL,0FH

CALL H2C

JC SHOW_OUT

MOV DX,88H

OUT DX,AL

POP AX

AND AL,0FH

CALL H2C

JC SHOW_OUT

MOV DX,88H

OUT DX,AL

MOV CX,0FFH

DELA:

LOOP DELA

SHOW_OUT:

POP DX

RET

SHOW ENDP

H2C PROC NEAR

CMP AL,0

JAE N0_9

JMP H2C_ERR

N0_9:

CMP AL,9

JBE N0_9_OK

CMP AL,0AH

JAE HEX_CMP

JMP H2C_ERR

HEX_CMP:

CMP AL,0FH

JBE HEX_CMP_OK

JMP H2C_ERR

HEX_CMP_OK:

CLC

ADD AL,37H

JMP CMP_OUT

N0_9_OK:

CLC

ADD AL,30H

JMP CMP_OUT

H2C_ERR:

STC

CMP_OUT:

RET

H2C ENDP

DELAY PROC NEAR

MOV CX,0FFH

DELEA:

LOOP DELEA

RET

DELAY ENDP

CODE ENDS

END START

實驗報告的實驗原理怎么寫篇3

課程設計報告

課題名稱: C減語言編譯器的詞法分析器與語法分析器設計

提交文檔學生姓名:

提交文檔學生學號:

同組 成 員 名 單: 無

指導 教 師 姓 名: 張 斌

指導教師評閱成績:

指導教師評閱意見:

提交報告時間: 年 月 日

課程設計目標

學生在學習《編譯原理》課程過程中,結合前5個章節的構造編譯程序的詞法掃描和語法分析的基本理論完成課程設計。要求實現一個小編譯程序(包括符號表的構造,詞法分析,語法分析),使學生將理論與實際應用結合起來。其中詞法掃描輸入為C- 語言的源程序(后綴名用.cm)文件,輸出為C-語言的token序列,語法分析程序的輸入為C-語言的源程序,輸出為程序的語法樹。語法樹的表示主要通過各個結構token的縮進來表示出樹的結構。

詞法分析

慣用詞法

1.關鍵字:else if int return void while所有的關鍵字都是保留字,并且必須是小寫。

2.專用符號:+ - * / < >= == != = ; , ( ) [ ] { } /* */

3.其他標記是ID和NUM,通過下列正則表達式定義:

ID=letter letter*

NUM=digit digit*

letter=a|..|z|A..|Z

digit=0|..|9

說明:C-語言區分大小寫,ID表示標識符,由一個或多個字母組成,標識符只能包含字母中間不能有數字,NUM表示數字。

4.空格由空白、換行符和制表符組成??崭裢ǔ1缓雎裕隽怂鼌^分開ID、NUM關鍵字。

5.注釋用通常的C語言符號/*...*/圍起來。注釋可以放在任何空白出現的位置(即注釋不能放在標記內)上,且可以超過一行。注釋不能嵌套。C-語言的注釋與C語言的塊注釋相同。

算法描述

本程序算法通過以換行符為分割符將待分析的程序劃分為各行。對于每行調用DealSymbol函數逐字分析,找到token,調用AddSpace函數將token前后插入空格,返回處理完后的程序行。

再將處理后的程序行字符串返回給Morphology函數(),函數將該字符串(即一行程序)以空格為分割符將待分析的程序行劃分為各token(調用split方法分割可將多余的空格刪去)。聲明一個標記注釋用的int型參數,并將其初始化為0(0表示不在注釋中,1表示出于注釋狀態),隨后逐詞掃描。

當注釋標記為0時,

掃描到"/*",注釋標記賦值為1;

掃描到if,else,int,return,void,while輸出"reserved word: " + 該token;

掃描到+ - * / < > = != = == ; , ( ) [ ] { } 直接輸出 該token;

掃描到字母,則連續逐字掃描,直到掃描到非字母則返回"error",否則輸出 "ID , name = " + 該token;

掃描到數字,則連續逐字掃描,直到掃描到非數字則返回"error",否則輸出 "NUM , val = " + 該token;

當注釋標記為1時,

直到掃描到"*/",注釋標記賦值為0;

否則直接輸出掃描到的項

核心源代碼

private string AddSpace(string Tmp, int j, int l)

{

if (j > 0 && j < Tmp.Length - l)

{

Tmp = Tmp.Substring(0, j) + " " + Tmp.Substring(j, l) + " " + Tmp.Substring(j + l,

Tmp.Length - j - l);

}

else if (j == 0 && j < Tmp.Length - l)

{

Tmp = Tmp.Substring(j, l) + " " + Tmp.Substring(j + l, Tmp.Length - j - l);

}

else if (j > 0 && j == Tmp.Length - l)

{

Tmp = Tmp.Substring(0, j) + " " + Tmp.Substring(j, l);

}

return Tmp;

}

private string DealSymbol(string Tmp)

{

for (int j = 0; j < Tmp.Length; j++)

{

if (Tmp[j] == "+" || Tmp[j] == "-" || Tmp[j] == ";" || Tmp[j] == "," || Tmp[j] == "(" || Tmp[j] == ")" || Tmp[j] == "[" || Tmp[j] == "]" || Tmp[j] == "{" || Tmp[j] == "}")

{//加空格

Tmp = AddSpace(Tmp, j, 1);

j++;

}

else if (Tmp[j] == "" || Tmp[j] == "=" || Tmp[j] == "!")

{

if (j < Tmp.Length - 1)

{

if (Tmp[j + 1] == "=")

{

Tmp = AddSpace(Tmp, j, 2);

j += 2;

}

else

{

Tmp = AddSpace(Tmp, j, 1);

j ++;

}

}

}

else if (Tmp[j] == "*")

{

if (j < Tmp.Length - 1)

{

if (Tmp[j + 1] == "/")

{

Tmp = AddSpace(Tmp, j, 2);

j += 2;

}

else

{

Tmp = AddSpace(Tmp, j, 1);

j++;

}

}

}

else if (Tmp[j] == "/")

{

if (j < Tmp.Length - 1)

{

if (Tmp[j + 1] == "*")

{

Tmp = AddSpace(Tmp, j, 2);

j += 2;

}

else

{

Tmp = AddSpace(Tmp, j, 1);

j++;

}

}

}

}

return Tmp;

}

private void Morphology ()

{

int Remark = 0;

int i, j;

SourceCode.Text += "\r\n@";

string[] Line = SourceCode.Text.Split("\n");

i = 0;

while (Line[i] != "@") //逐行

{

Output.Text += (i + 1).ToString() + ": " + Line[i] + "\n";

Line[i] = Line[i].Replace("\r", " @");

Line[i] = Line[i].Trim();

Line[i] = DealSymbol(Line[i]);

string[] Tmp = Line[i].Split(" ");

j = 0;

i++;

while (Tmp[j] != "@") //逐字

{

if (Remark == 0 && Tmp[j] != "") //非注釋a

{

if (Tmp[j] != "/*")

{

Output.Text += " " + i.ToString() + ": "; //加行號

}

else

{

Remark = 1;

}

//保留字

if (Tmp[j] == "if" || Tmp[j] == "else" || Tmp[j] == "int" || Tmp[j] == "return" || Tmp[j] == "void" || Tmp[j] == "while")

{

Output.Text += "reserved word: " + Tmp[j] + "\r\n";

}

//專用符號

else if (Tmp[j] == "+" || Tmp[j] == "-" || Tmp[j] == "*" || Tmp[j] == "/" || Tmp[j] == "" || Tmp[j] == "=" || Tmp[j] == "!=" || Tmp[j] == "=" || Tmp[j] == "==" || Tmp[j] == ";" || Tmp[j] == "," || Tmp[j] == "(" || Tmp[j] == ")" || Tmp[j] == "[" || Tmp[j] == "]" || Tmp[j] == "{" || Tmp[j] == "}")

{

Output.Text += Tmp[j] + "\r\n";

}

//ID

else if ((Tmp[j][0] >= "a" && Tmp[j][0] = "A" && Tmp[j][0] = "a" && Tmp[j][k] = "A" && Tmp[j][k] = "0" && Tmp[j][0] = "0" && Tmp[j][k] declaration-list

2.declaration-list->declaration-list declaration | declaration

3.declaration -> var-declaration | fun-declaration

4.var-declaration -> type-specifier ID ; | type-specifier ID [NUM ]

5.type-specifier ->int | void

6.fun-declaration ->type-specifier ID ( params ) compound-stmt

7.params -> param-list | void

8.param-list ->param-list , param | param

9.param ->type-specifier ID | type-specifier ID [ ]

10.compound-stmt -> { local-declaration statement-list }

11.local-declarations -> local-declarations var-declaration | empty

12.statement-list -> statement-list statement | empty

13.statement ->expression | compound-stmt | selection-stmt | iteration-stmt | return-stmt

14.expression-stmt -> expression ; | ;

15.selection-stmt -> if ( expression ) statement | if ( expression ) statement

16.iteration-stmt -> while ( expression ) statement

17.return-stmt-> return ; | return expression ;

18.expression -> var = expression | simple-expression

19.var ->ID | ID [ expression ]

20.simple-expression -> additive-expression relop additive-expression | additive-expression

21.relop -> | >= | == | !=

22.additive-expression -> additive-expression addop term | term

23.addop -> + | -

24.term -> term mulop factor | factor

25.mulop -> * | /

26.factor -> ( expression ) | var | call | NUM

27.call -> ID ( args )

28.args -> arg-list | empty

29.arg-list -> arg-list , expression | expression

語法樹結構表述

基本同屬結構為:

語句的表述

if語句(選擇語句):

while語句(循環語句)

output語句:

return語句:

word/media/image5.gif

復合語句:復合語句由“{”符號開始,后面跟著聲明和語句列表作為其子節點(子節點之間為同屬連接)

word/media/image6.gif

賦值表達式:(賦值表達式將賦值符號右邊的表達式作為子節點,將賦值符號右邊作為父節點)

word/media/image7.gif

算符表達式:

word/media/image8.gif

數組表達式:

word/media/image9.gif

算法描述

本程序算法總體思路是基于自底向上的分析進行語法樹的構建。

第一步是調用之前寫好的詞法分析進行分析。將詞法分析所得到的結果通過textbox保存,隨后對每一行進行分析。

首先根據語法規則找到語句的first 集。再根據詞法分析的結果進行逐詞掃描,掃描到對應的先行詞后,對隨后可能出現的的token進行選擇分析。把每一個獨立的語句作為一個Point,語法樹的構建可以在此基礎上視作圖的構建,即按Point之間的邏輯將其連接,再將Point的枝葉添加上去。例如:if (x>0),這條代碼中的Point是if語句,Point的枝葉是表達式 ( x>0 )。

在掃描的過程中,建立一個嵌套棧和一個跟從集用于描述Point之間的邏輯關系。其中嵌套棧是用來保存嵌套的Point,即每一次進入新的一層嵌套之前。并保存下進入嵌套point的ID,且棧頂指針加1,每退出嵌套(”}” 或if | while 語句計數為0)棧頂指針減1。有嵌套棧頂始終保存當前嵌套下最新Point的ID。而跟從集則用于保存先當前Point跟從于哪一個Point后,體現在語句上是將跟從集[Point_ID] = 嵌套棧[棧頂],與嵌套棧配合則可以明確的表示出Point之間的層次關系。

對于程序中的表達式的分析采用中綴表達式的思想,對于所有運算符的優先級給予定義,并在ExpAnalysis()函數中進行分析,返回給PraseAnalysis()函數完成的表達式樹的根節點。

最后根據跟從集將連接有枝葉的Point連接起來定義第一個Point為樹的根節點,并顯示則算法結束。

核心源代碼

int Contr = 0;

private TreeNode ExpAnalysis(string[] str)

{

int i = 0, opPtr = 0, idPtr = 0;

TreeNode[] id = new TreeNode[100];

string[] op = new string[100];

if (str[i] == ";" || str[i] == "/" || str[i] == "*" || str[i] == "-" || str[i] == "+" || str[i] == "(" || str[i]

== ")" || str[i] == "==" || str[i] == "!=" || str[i] == ">=" || str[i] == "" || str[i] == "=")

{

op[opPtr++] = str[i];

int j = opPtr - 1;

if (j > 0)

{

while ((Priority (op[j]) 推薦訪問: 實驗 原理 通用

【實驗報告的實驗原理怎么寫范文(通用3篇)】相關推薦

工作總結最新推薦

NEW