江蘇科技大學(xué)編譯原理實驗報告_第1頁
江蘇科技大學(xué)編譯原理實驗報告_第2頁
江蘇科技大學(xué)編譯原理實驗報告_第3頁
江蘇科技大學(xué)編譯原理實驗報告_第4頁
江蘇科技大學(xué)編譯原理實驗報告_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實驗一 詞法分析設(shè)計一、實驗?zāi)康耐ㄟ^本實驗的編程實踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè)計的原理和構(gòu)造方法,使學(xué)生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運用。二、實驗內(nèi)容用VC+/VB/JAVA語言實現(xiàn)對C語言子集的源程序進(jìn)行詞法分析。通過輸入源程序從左到右對字符串進(jìn)行掃描和分解,依次輸出各個單詞的內(nèi)部編碼及單詞符號自身值;若遇到錯誤則顯示“Error”,然后跳過錯誤部分繼續(xù)顯示 ;同時進(jìn)行標(biāo)識符登記符號表的管理。以下是實現(xiàn)詞法分析設(shè)計的主要工作:(1)從源程序文件中讀入字符。(2)統(tǒng)計行數(shù)和列數(shù)用于錯誤單詞的定位。(3)刪除空

2、格類字符,包括回車、制表符空格。(4)按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。(屬性值token的機內(nèi)表示)(5)如果發(fā)現(xiàn)錯誤則報告出錯(6)根據(jù)需要是否填寫標(biāo)識符表供以后各階段使用。單詞的基本分類:u 關(guān)鍵字:由程序語言定義的具有固定意義的標(biāo)識符。也稱為保留字例如 if、 for、while、printf ; 單詞種別碼為1。u 標(biāo)識符:用以表示各種名字,如變量名、數(shù)組名、函數(shù)名;u 常數(shù): 任何數(shù)值常數(shù)。如 125, 1,0.5,3.1416;u 運算符:+、-、*、/;u 關(guān)系運算符: <、<=、= 、>、>=、<>;u 分界符: ;、,、(、)、;

3、三、詞法分析實驗設(shè)計思想及算法 1、主程序設(shè)計考慮:u 程序的說明部分為各種表格和變量安排空間。在具體實現(xiàn)時,將各類單詞設(shè)計成結(jié)構(gòu)和長度均相同的形式,較短的關(guān)鍵字后面補空。 k數(shù)組-關(guān)鍵字表,每個數(shù)組元素存放一個關(guān)鍵字(事先構(gòu)造好關(guān)鍵字表)。s 數(shù)組-存放分界符表(可事先構(gòu)造好分界符表)。為了簡單起見,分界符、算術(shù)運算符和關(guān)系運算符都放在s表中(編程時,應(yīng)建立算術(shù)運算符表和關(guān)系運算符表,并且各有類號),合并成一類。 id 和ci 數(shù)組分別存放標(biāo)識符和常數(shù)。 instring 數(shù)組為輸入源程序的單詞緩存。 outtoken 記錄為輸出內(nèi)部表示緩存。 還有一些為造表填表設(shè)置的變量。 u 主程序開始

4、后,先以人工方式輸入關(guān)鍵字,造k表;再輸入分界符等造 p 表。 u 主程序的工作部分設(shè)計成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個循環(huán)處理一個單詞;接收鍵盤上送來的一個單詞;調(diào)用詞法分析過程;輸出每個單詞的內(nèi)部碼。例如,把每一單詞設(shè)計成如下形式: (type,pointer)其中type指明單詞的種類,例如:Pointer指向本單詞存放處的開始位置。還有一些為造表填表設(shè)置的變量。 u 主程序開始后,先以人工方式輸入關(guān)鍵字,造k表;再輸入分界符等造 p 表。 u 主程序的工作部分設(shè)計成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個循環(huán)處理一個單詞;接收鍵盤上送來的一個單詞;調(diào)用詞法分析過程;輸出每個單詞的內(nèi)部碼。例如,把每一單詞設(shè)計

5、成如下形式: (type,pointer)其中type指明單詞的種類,例如:Pointer指向本單詞存放處的開始位置。詞法分析設(shè)計流程圖2、詞法分析過程考慮 u 根據(jù)輸入單詞的第一個字符(有時還需讀第二個字符),判斷單詞類,產(chǎn)生類號:以字符k表示關(guān)鍵字;id表示標(biāo)識符;ci表示常數(shù);s 表示分界符。 u 對于標(biāo)識符和常數(shù),需分別與標(biāo)識符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過,將標(biāo)識符按順序填入數(shù)組 id 中,將常數(shù)變?yōu)槎M(jìn)制形式存入數(shù)組中 ci 中,并記錄其在表中的位置。lexical 過程中嵌有兩個小過程:一個名為 getchar,其功能為從 in

6、string 中按順序取出一個字符,并將其指針 pint 加 1 ;另一個名為 error,當(dāng)出現(xiàn)錯誤時,調(diào)用這個過程,輸出錯誤編號。u 要求:所有識別出的單詞都用兩個字節(jié)的等長表示,稱為內(nèi)部碼。第一個字節(jié)為 t ,第二個字節(jié)為 i 。 t 為單詞的種類。關(guān)鍵字的 t=;分界符的 t=;算術(shù)運算符的 t=;關(guān)系運算符的 t=;無符號數(shù)的 t=;標(biāo)識符的 t=。i 為該單詞在各自表中的指針或內(nèi)部碼值。表 1 為關(guān)鍵字表;表 2 為分界符表;表 3 為算術(shù)運算符的 i 值;表 4 為關(guān)系運算符的 i 值。 取字符和統(tǒng)計字符行列位置子程序四、實驗要求1、編程時注意編程風(fēng)格:空行的使用、注釋的使用、縮

7、進(jìn)的使用等。2、將標(biāo)識符填寫的相應(yīng)符號表須提供給編譯程序的以后各階段使用。3、根據(jù)測試數(shù)據(jù)進(jìn)行測試。測試實例應(yīng)包括以下三個部分:u 全部合法的輸入。u 各種組合的非法輸入。u 由記號組成的句子。4、詞法分析程序設(shè)計要求輸出形式:例:輸入VC+語言的實例程序:If i=0 then n+;a= 3b %);輸出形式為:單詞 二元序列 類 型 位置(行,列) (單詞種別,單詞屬性)for (1,for ) 關(guān)鍵字 (1,1) i ( 6,i ) 標(biāo)識符 (1,2)= ( 4,= ) 關(guān)系運算符 (1,3)0 ( 5,0 ) 常數(shù) (1,4)then ( 1,then) 關(guān)鍵字 (1,5)n (6,

8、n ) 標(biāo)識符 (1,6)+ Error Error (1,7); ( 2, ; ) 分界符 (1,8)a (6,a ) 標(biāo)識符 (2,1)= (4,<= ) 關(guān)系運算符 (2,2)3b Error Error (2,4)% Error Error (2,4)) ( 2, ) ) 分界符 (2,5); ( 2, ; ) 分界符 (2,6)五、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調(diào)試。2、 編制好源程序后,設(shè)計若干用例對系統(tǒng)進(jìn)行全面的上機測試,并通過所設(shè)計的詞法分析程序;直至能夠得到完全滿意的結(jié)果。六、程序源代碼1、詞法分析器操作類package 詞法分析器;public

9、class compiler public String computerComp(String str) String output="" int index=0; while(index<str.length()/判斷界符 if(isJieFu(str.charAt(index) output+=("(界符,"+str.charAt(index)+")"); index+; /判斷運算符 else if(isCompu(str.charAt(index)if(!isCompu(str.charAt(index+1)outpu

10、t+=("(運算符,"); elseif(!isCompu(str.charAt(index+2) && isCompu(str.charAt(index+1)if(str.charAt(index)='!')if(str.charAt(index+1)='=')output+=("(運算符,");elseoutput+=("(非法字符,");elseif(str.charAt(index)='>'|str.charAt(index)='<')

11、 | (str.charAt(index)='*'|str.charAt(index)='/') | (str.charAt(index)='%'|str.charAt(index)='=')if(str.charAt(index+1)='=') output+=("(運算符,"); elseoutput+=("(非法字符,");elseif(str.charAt(index)='+'|str.charAt(index)='-')if(str.

12、charAt(index)=str.charAt(index+1) | str.charAt(index+1)='=')output+=("(運算符,");elseoutput+=("(非法字符,");elseoutput+=("(非法字符,");elseoutput+=("(非法字符,");while(isCompu(str.charAt(index) output+=(str.charAt(index); index+; if(index>=str.length() return outp

13、ut;output+=(")");/數(shù)字 else if(isMath(str.charAt(index)int index1=index; output+=("("); while(isMath(str.charAt(index)output+=(str.charAt(index); index+; if(index>=str.length() return output; if(isLetter(str.charAt(index)while(!isMath(str.charAt(index) && (isLetter(str.c

14、harAt(index) output+=(str.charAt(index);index+; if(index>=str.length() return output;output+=(",非法字符)");elseif(str.charAt(index1)='0')if(isMath(str.charAt(index1+1)output+=(",非法字符)");elseoutput+=(",數(shù)字,)");elseoutput+=(",數(shù)字,)");/字母判斷 else if(isLetter

15、(str.charAt(index) int i=index;while(isLetter(str.charAt(index)|isMath(str.charAt(index)if(index>=str.length() return output; index+;String sub =str.substring(i, index);/判斷是是不是關(guān)鍵字 if(isKeyword(sub) output+=("(關(guān)鍵字,"+sub+")"); else output+=("(標(biāo)識符,"+sub+")");/

16、空格或者回車處理 else index+; return output;/判斷是不是關(guān)鍵字 public boolean isKeyword(String str) boolean flag=true; String arr="public","static","void","main","String","int","boolean","private","if","else","wh

17、ile" ;for(int i=0;i<arr.length;i+)if(str.equals(arri)flag=true; break; else flag=false; return flag;/判斷是不是字母public boolean isLetter(char charr)if(charr>='a'&&charr<='z')|(charr>='A'&&charr<='Z') | charr='_') return true; els

18、e return false;public boolean isMath(char charr) if(charr>='0')&&(charr<='9') return true; else return false; /判斷是不是界符得方法 public boolean isJieFu(char charr) char arr='','','','','','"' for(int i=0;i<arr.length;i+)

19、if (charr=arri) return true; return false; /判斷是不是運算符得方法public boolean isCompu(char charr) boolean flag=false; char arr='=','+','-','*','!','/','<','>','%' for(int i=0;i<arr.length;i+) if (charr=arri) flag=true; break; e

20、lse flag=false; return flag; 2、 界面類package 詞法分析器;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import javax.swing.border.TitledBorder;public class ciFa extends JFrame private JButton jbtShow = new JButton("進(jìn)行詞法分析"); private JT

21、extArea jta = new JTextArea();private JTextArea jtaOut = new JTextArea(); private JPanel jpl=new JPanel(); private String intput ="" private String output ="" private compiler comp = new compiler(); public static void main(String args) / TODO 自動生成的方法存根ciFa frame = new ciFa(); fra

22、me.setTitle("詞法分析器"); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(600, 400); frame.setVisible(true); public ciFa()jta.setWrapStyleWord(true); jta.setLineWrap(true); jtaOut.setWrapStyleWord(true); jtaOut.setLineWrap(true); jtaOut.se

23、tEditable(false); JScrollPane scrollPane = new JScrollPane(jta); JScrollPane scrollPane2 = new JScrollPane(jtaOut); scrollPane.setPreferredSize(new Dimension(300,300); scrollPane2.setPreferredSize(new Dimension(300,300); jtaOut.setBorder(new TitledBorder("詞法分析結(jié)果"); jta.setBorder(new Titled

24、Border("請在這輸入"); jpl.setLayout(new GridLayout(1,2); jpl.add(jta); jpl.add(jtaOut); add(jbtShow,BorderLayout.SOUTH); add(jpl);jbtShow.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e)intput = jta.getText(); output=puterComp(intput); jtaOut.append(output););七、

25、運行結(jié)果八、實驗總結(jié)由于關(guān)鍵字表、關(guān)系運算符表、算術(shù)運算符表都是內(nèi)部代碼添加的,沒有實現(xiàn)讓用戶自己添加的功能,本程序還只能分析*.c和*.java文件,而且沒有區(qū)分大小寫的功能。但由于代碼比較靈活可以比較方便的修改,并添加想要的功能。 通過此次實驗,我對詞法分析器的運行步驟、組織結(jié)構(gòu)有了更深層次的了解,熟練掌握了詞法分析程序設(shè)計的原理和構(gòu)造方法。實驗二 LL(1)分析法一、實驗?zāi)康?通過完成預(yù)測分析法的語法分析程序,了解預(yù)測分析法和遞歸子程序法的區(qū)別和聯(lián)系。使學(xué)生了解語法分析的功能,掌握語法分析程序設(shè)計的原理和構(gòu)造方法,訓(xùn)練學(xué)生掌握開發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專業(yè)素質(zhì),為培養(yǎng)適應(yīng)社

26、會多方面需要的能力。二、實驗內(nèi)容u 根據(jù)某一文法編制調(diào)試 LL ( 1 )分析程序,以便對任意輸入的符號串進(jìn)行分析。u 構(gòu)造預(yù)測分析表,并利用分析表和一個棧來實現(xiàn)對上述程序設(shè)計語言的分析程序。u 分析法的功能是利用LL(1)控制程序根據(jù)顯示棧棧頂內(nèi)容、向前看符號以及LL(1)分析表,對輸入符號串自上而下的分析過程。 三、 LL(1)分析法實驗設(shè)計思想及算法u 模塊結(jié)構(gòu):(1)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。(2)初始化:設(shè)立LL(1)分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時變量等);(3)控制部分:從鍵盤輸入一個表達(dá)式符號串;(4)利用LL(1)分析算法進(jìn)行表達(dá)式處理:根據(jù)LL

27、(1)分析表對表達(dá)式符號串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯誤則顯示錯誤信息。四、實驗要求1、編程時注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、如果遇到錯誤的表達(dá)式,應(yīng)輸出錯誤提示信息。 3、對下列文法,用LL(1)分析法對任意輸入的符號串進(jìn)行分析: (1)E->TG(2)G->+TG|TG(3)G->(4)T->FS(5)S->*FS|/FS(6)S->(7)F->(E)(8)F->i輸出的格式如下:五、實驗步驟1、根據(jù)流程圖編寫出各個模塊的源程序代碼上機調(diào)試。2、 編制好源程序后,設(shè)計若干用例對系統(tǒng)進(jìn)行全面的上機測試

28、,并通過所設(shè)計的LL(1)分析程序;直至能夠得到完全滿意的結(jié)果。六、程序源代碼1、操作類package test2;public class LL1_Opertion private char strChar;/ 輸入串private char stack = new char1000;/ 分析棧private int top = 0;/ 分析棧指針private int strPointer = 0;/ 輸入串指針private int length;/ 輸入串長度private String analysisTable = new String69;/ 分析表private final c

29、har constChar = 'i', '(', '+', '-', '*', '/', ')', '#' ;/ 常字符private String dataStrings = new String10005;/ 結(jié)果數(shù)據(jù)表private String tempString = new String();/ 臨時字符串private String result = new String();/ 得出的結(jié)果字符串private int dataRow = 0;/ 數(shù)據(jù)

30、表行數(shù)/* * 規(guī)則 i ( + - * / ) # E E->TG E->TG synch synch G G->+TG G->-TG G-> G-> T * T->FS T->FS synch synch synch synch S S-> S-> S->*FS S->/FS S-> S-> F * F->i F->(E) synch synch synch synch synch synch */public LL1_Opertion() / 初始化各個參數(shù)for (int i = 0; i

31、< 6; i+) for (int j = 0; j < 9; j+) analysisTableij = new String();analysisTableij = " "for (int i = 0; i < 1000; i+) for (int j = 0; j < 5; j+) dataStringsij = new String();dataStringsij = ""analysisTable01 = "i"analysisTable02 = "("analysisTable0

32、3 = "+"analysisTable04 = "-"analysisTable05 = "*"analysisTable06 = "/"analysisTable07 = ")"analysisTable08 = "#"analysisTable10 = "E"analysisTable20 = "G"analysisTable30 = "T"analysisTable40 = "S"anal

33、ysisTable50 = "F"analysisTable11 = "TG"analysisTable12 = "TG"analysisTable23 = "+TG"analysisTable24 = "-TG"analysisTable27 = ""analysisTable28 = ""analysisTable31 = "FS"analysisTable32 = "FS"analysisTable43 = &

34、quot;"analysisTable44 = ""analysisTable45 = "*FS"analysisTable46 = "/FS"analysisTable47 = ""analysisTable48 = ""analysisTable51 = "i"analysisTable52 = "(E)"stacktop = '#'stack+top = 'E'public boolean checkChar

35、(char needCheck) / 檢查字符是否在字符表中for (int i = 0; i < constChar.length; i+) if (needCheck = constChari) return true;return false;public void printStack() / 輸出分析棧this.tempString = new String();for (int i = 0; i < top + 1; i+) this.tempString += stacki;System.out.print(stacki);result += stacki;Syste

36、m.out.print("tt");result += "tt"public void printStr() / 輸出剩余輸入串this.tempString = new String();for (int i = 0; i < strPointer; i+) System.out.print(" ");result += " "for (int i = strPointer; i < length; i+) this.tempString += strChari;System.out.print(st

37、rChari);result += strChari;System.out.print("ttt");result += "ttt"public void analysis(String line) / LL(1)分析strChar = line.toCharArray();length = strChar.length;String analysisString = new String();char ch = strCharstrPointer;char topX;int finish = 0, flag = 0;int row = 0, colum

38、n = 0;System.out.print("步驟tt分析棧 tt剩余字符 tt所用產(chǎn)生式 tt動作n");result += "步驟tt分析棧 tt剩余字符 tt所用產(chǎn)生式 tt動作rn"dataStrings00 = dataRow+ + ""System.out.print(dataRow + "tt");result += dataRow + "tt"printStack();dataStrings01 = tempString;printStr();dataStrings02 = t

39、empString;dataStrings04 = "初始化"result += " tt初始化rn"System.out.print("n");do topX = stacktop-;dataStringsdataRow0 = dataRow + ""System.out.print(dataRow + "tt");result += dataRow + "tt"for (int i = 0; i < 9; i+) / 判斷是否為非終結(jié)符if (checkChar(t

40、opX) flag = 1;break;if (flag = 1) / 如果是終結(jié)符if (topX = '#') finish = 1;System.out.println("over");result += "overrn"break;if (topX = ch) printStack();dataStringsdataRow1 = tempString;ch = strChar+strPointer;printStr();dataStringsdataRow2 = tempString;System.out.print("

41、匹配n");dataStringsdataRow4 = "GETNEXT(I)"result += " ttGETNEXT(I)rn"flag = 0;this.dataRow+; else printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print("錯誤n");result += " tt錯誤rn"this.dataRow+;break; else

42、for (int i = 0; i < 6; i+) if (topX = analysisTablei0.charAt(0) row = i;break;for (int i = 0; i < 9; i+) if (ch = analysisTable0i.charAt(0) column = i;break;analysisString = analysisTablerowcolumn;if (!analysisString.equals(" ") if (!analysisString.equals("") for (int i = a

43、nalysisString.length() - 1; i >= 0; i-) stack+top = analysisString.charAt(i);printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print(analysisTablerow0 + "->"+ analysisString + "n");dataStringsdataRow3 = analysisTablerow0 +

44、"->"+ analysisString;result += analysisTablerow0 + "->" + analysisString;if (!analysisString.equals("") dataStringsdataRow4 = "POP,PUSH(" + analysisString+ ")"result += "ttPOP,PUSH(" + analysisString + ")rn" else dataStrings

45、dataRow4 = "POP"result += "ttPOPrn"if (stacktop = ' ') top-;this.dataRow+; else printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print("出錯n");result += " tt錯誤rn"this.dataRow+;break; while (finish = 0)

46、;public String getDataStrings() return dataStrings;public void setDataStrings(String dataStrings) this.dataStrings = dataStrings;public int getDataRow() return dataRow;public void setDataRow(int dataRow) this.dataRow = dataRow;public String getResult() return result;public void setResult(String resu

47、lt) this.result = result;2、界面類package test2;import java.io.BufferedReader;public class LL1SWT protected Shell shell;private Text text;private Text text_1;private Table table;private MessageBox messageBox;private File sourceFile = null;private LL1_Opertion mOpertion;private String Language = new Stri

48、ng();private String analysisString = new String();private String result = new String();/* * Launch the application. * * param args */public static void main(String args) try LL1SWT window = new LL1SWT();window.open(); catch (Exception e) e.printStackTrace();/* * Open the window. */public void open()

49、 Display display = Display.getDefault();createContents();shell.open();shell.layout();while (!shell.isDisposed() if (!display.readAndDispatch() display.sleep();/* * Create contents of the window. */protected void createContents() shell = new Shell();shell.setSize(570, 565);shell.setText("LL(1)u5

50、206u6790u5668");Menu menu = new Menu(shell, SWT.BAR);shell.setMenuBar(menu);MenuItem menuItem = new MenuItem(menu, SWT.NONE);menuItem.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) try newTextTable(); catch (Exception e2) e2.printStackTrace(););menuItem.setText("u65B0u5EFA");MenuItem menuItem_1 = new MenuItem(menu, SWT.NONE);menuItem_1.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) openFile(););menuItem_1.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論