當前位置:首頁 » 編程軟體 » 編譯原理設計文檔是什麼

編譯原理設計文檔是什麼

發布時間: 2025-02-10 09:41:58

⑴ 學編程後悔死了

兒童學編程後悔,讓孩子學編程真是害了孩子嗎

現在的家長都希望自己的孩子能夠贏在起跑線上,所以從小就特別關注孩子的興趣及學習,目前不少家長都會給自己的孩子報上一兩個興趣班,如英語、舞蹈等,除此之外編程也是非常火爆的,但是一些家長讓兒童學習編程後出現後悔的情況,那麼讓孩子學編程真是害了孩子嗎?

當下提起編程這個興趣課程家長們都比較熟悉,它是信息學的一部分,孩子們會進行圖形處理、資料庫、網路知識以及熱門大數據等學習,整個課程內容是非常豐富的,同時孩子在學習編程的時候還能促進他的邏輯思維,不少孩子都很感興趣。但是一些家長出現後悔,且認為學習編程是害了孩子,主要是因為:

1、用眼過度。家長們沒有較好地控制孩子使用電腦的時間,從而影響了孩子眼部健康。

2、沉迷於電腦。一些孩子學習編程以後,脫離了家長的管束,則會以學習編程為借口而玩電腦游戲等,長時間下去孩子有可能沉迷於電腦。

其實就編程的學習來說對於孩子還是有很多好處的,但是凡事都是相對的,家長們不能任孩子玩電腦,即使學習編程家長們也要做好陪伴和監管工作,特別是對於年齡小一些的孩子來說更要如此,這樣相信多數家長都不會再後悔了。

不要學計算機學計算機我後悔了

之所以不建議學計算機是因為學計算機的人很多,學有所成比較困難。但是如果是真的喜歡這個行業,能花大力氣學習技術,能當一名優秀的程序員就很好了。

現在學計算機不行了嗎

我想第一個是這個學科的熱度,在現在這個互聯網社會上,計算機是人人都會用到了,用戶群體大,那需求自然不少,用戶對於現在的上網體驗要求越來越高,這就需要一大批計算機人才。

那麼學計算機的多,但是能當一個程序員,成為一個計算機專業人才的人很少,為什麼呢?首先,學計算機,學編程真的沒有辦法一蹴而就,只能潛移默化的學習,現在軟體編程語言種類繁多,各種新的框架和更好用的語言,框架,工具正在蓬勃發展,要想當一個程序員,必須要有終身學習的觀念,要不然一兩年就落伍了。

另一方面,在大學的計算機專業學的很多都是理論性知識,這造成了兩個結果,一個是學生覺得這個很枯燥乏味,不願學習。

另一個是與社會上的技術嚴重脫節,造成學生找不到工作。這樣學生就更不願意學習,在學校可能很多人就玩自己的,但是要想做一個好的程序員,在大學必須自己學習一些社會上的熱門技術,互聯網上有很多學習的地方,需要的話可以去看看我的文章。

再者,培訓機構也是程序員的孵化地,但是培訓機構一味去追逐社會熱門技術,就不會像大學一樣讓我們學習一些理論,比如說是資料庫原理,編譯原理,操作系統,計算機組成原理等,再加上培訓機構一般只培訓幾個月,

想一想,幾個月把教你這么多東西,你能實際操作了,程序員最注重的就是實際操作,編程能力,如果你沒有任何根基,去培訓機構就是浪費自己的時間。如果你在大學學過這方面的知識,那麼培訓機構會對你有一些幫助,當然前提是你要學習,不過我的建議是大學自己在網上學習,畢竟培訓機構收費不低。

總體上來說,學計算機的人多,但是能能有找到計算機方面工作的能力的人就不多了,能當一名優秀的程序員的人更少,如果是真的喜歡這個行業,並且有些一些堅持的恆心,能花大力氣學習技術,那我相信你會有一個好的回報。

如果你只是抱著這行跟熱門,想進來賺錢的話,我勸你還是算了,編程的行業是需要時間的。大學里有很多計算機專業的人大部分找工作都不是找這方面的工作,也有很多找計算機方面工作的人不是學計算機的,怎麼選擇全靠自己。

具備什麼特質能學計算機

一、對計算機專業相關知識充滿了興趣。通過提前對計算機知識的了解和初步學習,對計算機知識和發展前景充滿了興趣,能在一個個知識點、一串串代碼中找到學習的樂趣。興趣是最好的老師,當你對一件事情充滿濃厚興趣的時候,學習狀態和效果都是非常好的,學習計算機專業知識也一樣。

二、有很強的自我管理、自我學習能力。僅僅通過課堂的學習時間是很難把專業知識學通、學會的,通常需要在課前課後時間自己學習,把知識點學通鞏固。計算機也不是純理論記憶的專業,不僅需要完成很多實驗,編程能力也是結合知識通過不斷敲打代碼練就的,即使你有很強的記憶能力能在課堂時間把知識點記住,課後不進行編程訓練,是學不好編程的。所以學好計算機知識需要個人很強的自我管理和自我學習能力,計算機知識不能一時興起學一學,也不可能一蹴而就,要保持足夠的耐心,投入大量的時間學習、動手實驗和編程。

三、有很強的邏輯思維和計算能力。在第二點中已經說過,計算機知識單靠記憶是學不好的,還需要通過動手完成實驗和不斷編程訓練,而做好實驗和寫出好代碼則需要很強的邏輯思維和計算能力。不同編程人員對相同問題的分析理解是不一樣的,編寫出來的代碼有時候差別也很大,可能都能解決問題,但是代碼的時間復雜度、空間復雜度的差異就可以體現出那段代碼的好壞。能寫出良好時間、空間復雜度代碼的人通常都需要很強的邏輯思維和計算能力,如果這兩方面有不足,學習計算機知識會相當吃力。要鍛煉自己的邏輯思維和計算能力,則需要把數學學好,如果你想要報考計算機專業,也要評估一下自己的數學成績和演算法理解能力。當然,如果具備上面一、二點中所提到的特質,邏輯思維、計算能力等是可以通過後期學習、鍛煉提升的。

四、有比較好的英語成績。大家也都知道,現在大部分的編程、資料庫管理、網路管理工具都是美國的,所使用的語言基本上都是英語,很多技術說明文檔也是英語,比較前沿的計算機技術大多也是通過英語發布,如果英語不好、詞彙量不足,在學習計算機專業的過程中會遇到不小的困難。所以如果要學好計算機專業知識,也要重視英語成績的提高。

五、保持持續學習的熱情與狀態。計算機專業知識的學習不可能一蹴而就,也不可能一勞永逸,從對計算機毫不了解,到對計算機知識大致掌握和應用,再到計算機技術的更新,都需要保持持續的學習熱情與狀態。現在計算機技術的更新速度非常快,所學到的計算機專業知識可能很快就會落後,只有不斷學習並及時更新自己的知識體系才能跟上計算機技術發展的腳步。

那些讓孩子學習編程的家長後悔嗎?-簡書

少兒編程指針對高中以下的孩子所設計的編程學習類產品。用圖形化編程語言,把原來英語的代碼編程語言轉成圖形模塊化、指令化,以游戲、情景動畫、積木構建的形式呈現。

需要在這里說明的是,讓兒童學習編程,並不是為了讓他們將來都當程序員。少兒編程不同於IT職業教育,它減少了對於編程語言的實際操作的重視,轉而更加關注通過編程教育培養孩子們的計算機思維與創造能力,激發孩子內在學習動力以及發展團隊合作和溝通等全方位能力。

孩子學編程,並不是為了將來要從事專業的編程工作。從教育角度看,少兒編程的核心的理念是把計算機編程看作與閱讀、表達、數學等一樣的,小朋友成長所需的基礎技能來培養。發達國家對推廣編程教育的觀點是:編程技能已不僅是信息行業對人才的需求,而將是所有行業的需求。各行各業需要的也不僅是軟體專業人才,而是掌握編程技能的行業專業人才。

為什麼很多人後悔學計算機,做程序員很開心嗎

不是開心的問題,就是一種職業選擇,後悔是自己的選擇。問起很多人對程序開發這個行業的感受時,很多人經常說的一句話就是:外面的人想進來,裡面的人想出去。

選擇做程序的人,有些人是覺得他們對程序開發很感興趣,所以他們去做了這份職業;還有一些人選擇做程序員是因為他們覺得程序員的工資很高,如果做程序員,他們就可以在很短的時間里賺很多錢。在有錢以後,他們就可以做自己想做的事情,他們可以實現買房、買車、迎娶白富美、走上人生巔峰的夢想。

不管是為了興趣,還是為了錢,終歸有很多人選擇做了程序員。或許很多人在做程序員之前,他們總是把這個職業想像的很美好,但是他當他們真正去做了這份職業以後,他們才發現,高薪的背後其實有太多的心酸和付出。所以從這個角度上來說,程序員其實就是拿著自己的命在換金錢。

有的人在做了一段時間的程序員之後,他們覺得,既然自己已經入了程序員這個行業,既然這個行業的工資還不錯,那自己就先好好乾吧,趁著自己年輕,趁著自己還能加班熬夜的時候,自己就先多掙點錢,等到以後他們在三四十歲加不動班的時候,等到他們和年輕人拼不起的時候,他們再真正的去做點自己想做的事情。

做程序員需要的技能

1、基本功

這里說的基本功是會程序語言,程序語法,如果你是java程序員,就需要知道java語言語法,如果你是php程序員就需要知道php語言的語法,如果你是c++程序員就需要知道c++語言的語法,因此可以肯定的是學習一門計算機語言也是沒問題的。

2、邏輯思維能力

程序中的運算無非就是數值運算和邏輯運算,數值運算無非就是加減乘除,函數,公式什麼的,邏輯運算無非就是滿足什麼條件做什麼事情,90%的邏輯都是因為邏輯if、else什麼的,在什麼情況滿足什麼條件下做什麼事情。還有就是循環邏輯,無非就是做什麼,做幾次,每次有什麼變化,什麼時候終止。

⑵ 軟體工程師是干什麼的

cs201 全棧軟體工程師免費下載

鏈接:https://pan..com/s/1uvC9DjwH3O3qemDwhmO_OA

提取碼:djxg

全棧工程師是指掌握多種技能,勝任前端與後端,能利用多種技能獨立完成產品的人。

⑶ AD10怎麼從原理圖生成pcb

在Altium designer軟體中,在目標projects中新建一個PCB文件,然後執行更新命令即可。具體操作請參照以下步驟。

1、首先在電腦上打開Altium designer軟體,新建一個項目文件(project),然後再新建一個原理圖文件。

⑷ 原理圖設計基礎簡介

原理圖設計基礎簡介

《EDA技術》主要介紹EDA技術中最常用的兩個工具軟體——Protel 2004和Multisim 7。下面是我整理的關於原理圖設計基礎,歡迎大家參考!

一、 達成目標

l 熟練製作元件庫(元件原理圖庫、元件封裝庫、元件集成庫,包括元件在不同元件庫、原理圖、PCB板之間的復制)、原理圖、PCB板

l 熟練使用各種快捷鍵

l 熟悉各種設置

二、 重點

l 原理圖設計:

Ø 設置圖紙

Ø 設置原理圖優先設置

Ø 層次電路設計

Ø 元器件自動標注

Ø 編譯原理圖/項目

Ø 電氣檢查(電氣檢查規則、電氣連接矩陣)

Ø 添加封裝

Ø 檢查封裝

Ø 生成網表(網表文件)

l 元器件庫設計:

Ø 創建元器件庫

Ø 創建封裝庫

Ø 生成集成庫

l PCB設計:

Ø 圖紙設置

Ø 設置電路板外形尺寸

Ø 層疊管理

Ø 布線規則

Ø 電源劃分

Ø 地劃分

Ø 走線(等長線、差分線、曲線)

Ø 敷銅

三、 設計流程

l 原理圖設計流程

設置圖紙——》設置原理圖優先設置——》設置電器檢查規則(電氣檢查規則、電氣連接矩陣)——》添加元器件——》元器件電氣連接——》元器件自動標注——》編譯原理圖——》查看編譯結果,修改錯誤——》添加元器件封裝——》檢查元器件封裝——》生成網表文件

l 元器件庫設計流程

創建元器件庫——》編輯元器件——》創建封裝庫——》編輯元器件封裝——》元器件庫追加封裝——》編譯生成元器件集成庫

l PCB設計流程

設置PCB設計環境——》PCB布局——》布線規則設置——》自動布線——》手動調整布線——》敷銅——》添加過孔以連接各層的敷銅——》保存

四、 常用快捷鍵

l 原理圖和PCB通用快捷鍵:

Shift 當自動平移時,快速平移

Y 放置元件時,上下翻轉

X 放置元件時,左右翻轉

Shift+↑↓←→ 箭頭方向以十個網格為增量,移動游標

↑↓←→ 箭頭方向以一個網格為增量,移動游標

SpaceBar 放棄屏幕刷新

Esc 退出當前命令

End 屏幕刷新

Home 以游標為中心刷新屏幕

Ctrl+Home 將偏離圖紙的元件自動調整到工作原點

PageDown,Ctrl+滑鼠滾輪 以游標為中心縮小畫面

PageUp,Ctrl+滑鼠滾輪 以游標為中心防大畫面

滑鼠滾輪 上下移動畫面

Shift+滑鼠滾輪 左右移動畫面

V+D 顯示整個文檔

V+F 顯示所有對象

X+A 取消所有選中的對象

單擊並按住滑鼠右鍵 顯示滑動小手並移動畫面

點擊滑鼠左鍵 選擇對象

點擊滑鼠右鍵 顯示彈出菜單,或取消當前命令

右擊滑鼠並選擇Find Similar 選擇相同對象

點擊滑鼠左鍵並按住拖動 選擇區域內部對象

點擊並按住滑鼠左鍵 選擇游標所在的對象並移動

雙擊滑鼠左鍵 編輯對象

Shift+點擊滑鼠左鍵 選擇或取消選擇

TAB 編輯正在放置對象的屬性

Shift+C 清除當前過濾的對象

Shift+F 可選擇與之相同的對象

Y 彈出快速查詢菜單

F11 打開或關閉Inspector面板

F12 打開或關閉List面板

Ctrl+Shift+L 左對齊

Ctrl+Shift+R 右對齊

Ctrl+Shift+H 中對齊

Ctrl+T 頂部對齊

Ctrl+B 地步對齊

l 原理圖快捷鍵:

Alt 在水平和垂直線上限制對象移動

G 循環切換捕捉網格設置

SpaceBar 放置對象時旋轉90度

SpaceBar 放置電線、匯流排、多邊形線時激活開始/結束模式

Shift+SpaceBar 放置電線、匯流排、多邊形線時切換放置模式

BackSpace 放置電線、匯流排、多邊形線時刪除最後一個拐角

點擊並按住滑鼠左鍵+Delete 刪除所選中線的拐角

點擊並按住滑鼠左鍵+Insert 在選中的線處增加拐角

Ctrl+點擊並拖動滑鼠左鍵 拖動選中的對象

l PCB快捷鍵:

Shift+R 切換三種布線模式

Shift+E 打開或關閉電氣網格

Ctrl+G 彈出捕獲網格對話框

G 彈出捕獲網格菜單

N 移動元件時隱藏網狀線

L 鏡像元件到另一布局層(拖動元件時)

BackSpace 在布銅線時刪除最後一個拐角

Shift+SpaceBar 在布銅線時切換拐角模式

SpaceBar 布銅線時改變開始/結束模式

Shift+S 切換打開/關閉單層顯示模式

O+D+D+Enter 選擇草圖顯示模式

O+D+F+Enter 選擇正常顯示模式

O+D 顯示/隱藏Prefences對話框

L 顯示Board Layers對話框

Ctrl+H 選擇連接銅線

Ctrl+Shift+Left-Click 打斷線

+ 切換到下一層(數字鍵盤)

- 切換到上一層(數字鍵盤)

* 下一布線層(數字鍵盤)

M+V 移動分割平面層頂點

Alt 避開障礙物和忽略障礙物之間切換

Ctrl 布線時臨時不顯示電氣網格

Ctrl+M 測量距離

Shift+ SpaceBar 順時針旋轉移動的對象

SpaceBar 逆時針旋轉移動的對象

Q 米制和英制之間的單位切

l 高頻率使用的快捷鍵

TAB 選中元件後,可以顯示該元件的屬性

PAGEUP 以滑鼠所在點為中心,放大視圖

PAGEDOWN 以滑鼠所在點為中心,縮小視圖

HOME 居中,可以從原來游標下的圖紙位置,移位到工作區中心位置顯示

END 更新繪圖區的圖形

四個方向鍵 用於逐步往各個方向移動

F+U 列印設置

F+P 打開列印機

F+N 新建文件

F+O 打開文件

F+S 保存文件

F+V 列印預覽

E+U 取消上一步操作

E+F 查找

E+S 選擇

E+D 刪除

E+G 對齊

E+G+L 左對齊

V+D 顯示整個圖形區域

V+F 顯示所有元件

V+A 區域放大

V+E 放大選中的元件

V+P 以滑鼠單擊點為中心進行放大

V+O 縮小

V+5,1,2,4 放在50%,10%,200%,400%

V+N 將滑鼠所在點移動到中心

V+R 更新視圖

V+T 工具欄選擇

V+W 工作區面板選擇

V+G 網格選項

C 在視圖區打開工程快捷菜單

P+B 放置匯流排

P+U 放置匯流排介面

P+P 放置元件

P+J 放置接點

P+O 放置電源

P+W 連線

P+N 放置網路編號

P+R 放置IO口

P+T 放置文字

P+D 繪圖工具欄

D+B 瀏覽庫

D+L 增加/刪除庫

D+M 製作庫

T 打開工具菜單

R 打開報告菜單

W 打開窗口菜單

五、 其他

l 對象整體編輯

選元件——》查找相似對象——》編輯選項(如current footprint(same)選取了所有相同的封裝,取消“運行檢查器”選項)——》按住shift滑鼠單擊選中收索結果元件——》按住f11彈出inspector對話框,在current footprint選中封裝修改之——》保存退出

l 製作元器件庫時順便載入封裝

製作原理圖元器件時順便將pcb對應的庫文件載入,保證引腳一一對應(pin maps),然後對元件進行規則檢查

l 更改已存在的原理圖元件庫

以工程文件形式打開元件庫——》ctrl+a——》ctrl+c——》新建原理庫文件ctrl+v——》修改引腳——》修改元件屬性——》重命名——》建在footprint pcb庫封裝——》編輯引腳圖——》保存退出

隊列粘貼可用在復制大量屬性一致的.引腳上

l 從已有的pcb項目中把原件庫還原出來

打開pcb——》執行design——》make pcb library

l 從已有的sch原理圖項目中把原件庫還原出來

打開.sch文件——》執行design——》make project library

六、 繪制PCB的幾個要點

l 布線順序

先信號線,後電源地線

l 走線

Ø 蛇形線

P——》T: 布線

Shift+A: 切換成蛇形走線

`: 顯示當前可用操作

1、2、3、4: 改變蛇形走線弧度

,。: 改變蛇形走線振幅

Tab: 設置走線類型(曲線、折線)

Ø 曲線

Ctrl+Shift+Space

Ø 等長線(走線完成後設置等長)

新建類:Design——》Classes,右鍵Net Class——》Add Class,右鍵重命名

添加網路:向內裡面添加需要等長的網路

設置線路等長:T+R——》點擊某條需要修改的線路——》Tab設置等長線參數——》點擊“確定”,滑鼠沿線路移動,直到長度達到要求

Ø 差分線

原理圖中添加差分線(添加差分線標志,差分線組網路標簽結尾為_p、_N),將差分線規則導入PCB板(直接update即可)——》PCB文件中打開PCB面板,在PCB面板選擇Differential Pairs,在下面的框中選擇All Differential Pairs,這樣所有的差分對就在Designer框中出現了——》選中一對差分對,點擊Rule Wizard,進入Differential Pairs Wizard界面,設置差分對規則——》Place——》Differential Paris Routing開始布線,差分線布線時,兩根差分線會同時布線

Ø 等長蛇形差分線

Tool——》Interactive Diff Pair Length Tunning,調整方法與等長線一樣

l 敷銅

Ø 矩形填充

Ø 多邊形敷銅

Ø 多邊形填充挖空

Ø 切斷多邊形填充區

;

⑸ 急(高懸賞 幫個忙) 求編譯原理課程設計---c語言實現c-的語法分析,在線等

新建一個文本文檔在你工程目錄下,名字起為"輸入.txt",裡面的內容可以為
begin a:=1+7*(6+3);b:=1end#

輸出是在"輸出.txt"中查看,以下為輸出情況:

詞法分析結果如下:
(1, begin)
(10, a)
(18, :=)
(11, 1)
(13, +)
(11, 7)
(15, *)
(27, ()
(11, 6)
(13, +)
(11, 3)
(28, ))
(26, ;)
(10, b)
(18, :=)
(11, 1)
(6, end)
(0, #)
語法分析結果如下:(以四元式形式輸出)
( +, 6, 3, t1)

( *, 7, t1, t2)

( +, 1, t2, t3)

( =, t3, __, a)

( =, 1, __, b)

//提供一個編譯原理的語義分析程序 你可以直接復制 用TC進行調試
#include "stdio.h"
#include "string.h"
#include <malloc.h>
#include <conio.h>
#include "stdlib.h"

char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum,q;
int kk;
//四元式表的結構如下:
struct
{
char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
}quad[20];

char *factor();
char *expression();
int yucu();
char *term();
int statement();
int lrparser();
char *newtemp();
void scaner();
void emit(char *result,char *ag1,char *op,char *ag2);

void main()
{
FILE *fp1,*fp2;

if((fp1=fopen("輸入.txt","rt"))==NULL)
{
printf("Cannot open 輸入.txt\n");
getch();
exit(1);
}
if((fp2=fopen("輸出.txt","wt+"))==NULL)
{
printf("Cannot create 輸出.txt FILE.strike any key exit");
getch();
exit(1);
}

int j;
q=p=kk=0;
p=0;
//printf("Please Input a String(end with '#'):\n");
while(ch!='#')
{
ch = fgetc(fp1);
if(ch == EOF)
{
printf("文件為空,請檢查後再嘗試!");
return ;
}

prog[p++]=ch;
}
if(prog[p]=='#')
{
printf("輸入的待分析的串不是以'#'結尾,請修改之後再嘗試!\n");
return;
}
p=0;
char buffer1[200] = {0};
sprintf(buffer1,"詞法分析結果如下:\n");
fputs(buffer1,fp2);
//printf("詞法分析結果如下:\n");
do
{
scaner();
switch(syn)
{
case 11:
//printf("(%d,%d)\n",syn,sum);
sprintf(buffer1,"(%d, %d) \n",syn,sum);
fputs(buffer1,fp2);
break;
default:
//printf("(%d,%s)\n",syn,token);
sprintf(buffer1,"(%d, %s)\n",syn,token);
fputs(buffer1,fp2);
break;
}
}while(syn!=0);
printf("\n");

p=0;
char buffer[200]={0};
sprintf(buffer,"語法分析結果如下:(以四元式形式輸出)\n");
fputs(buffer,fp2);
//printf("語法分析結果如下:(以四元式形式輸出)\n");
scaner();//掃描函數
lrparser();
if(q>19)
printf(" to long sentense!\n");
else
{

for (j=0;j<q;j++)
{
//printf("( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);
sprintf(buffer,"( %s, %s, %s, %s) \n\n",quad[j].op1,quad[j].ag11,quad[j].ag21,quad[j].result1);
fputs(buffer,fp2);
}
}
printf("已把相應的詞法和語法的結果保存到相應的文件中,請查閱!\n");
fclose(fp1);
fclose(fp2);
}
int lrparser()
{
int schain=0;
kk=0;
if (syn==1) //得到begin
{
scaner();//掃描下個字元
schain=yucu();
if(syn==6)//得到end
{
scaner();//掃描下個字元
if((syn==0)&&(kk==0)) //得到#
printf("Success!\n");
}
else
{
if(kk!=1)
printf("short of 'end' !\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("short of 'begin' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
int yucu()
{
int schain=0;
schain=statement();
while(syn==26)
{
scaner();
schain=statement();
}
return (schain);
}
int statement()
{
char tt[8],eplace[8];
int schain=0;
if (syn==10)
{
strcpy(tt,token); //tt中保存的是第一個字元
scaner();
if(syn==18) //檢測到=號
{
scaner();
strcpy(eplace,expression());
emit(tt,eplace,"=","__");
schain=0;
}
else
{
printf("short of sign ':=' !\n");
kk=1;
getch();
exit(0);
}
return (schain);
}
}
char *expression()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);

strcpy(eplace,term());

while((syn==13)||(syn==14))
{
if (syn==13)
strcpy(tt,"+");
else
strcpy(tt,"-");

scaner();
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *term()
{
char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);

strcpy(eplace,factor());

while((syn==15)||(syn==16))
{
if (syn==15)
strcpy(tt,"*");
else
strcpy(tt,"/");
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *factor()
{
char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");

if(syn==10) //得到字元
{
strcpy(fplace,token);
scaner();
}
else if(syn==11) //得到數字
{
itoa(sum,fplace,10);
scaner();
}
else if(syn==27) //得到)
{
scaner();
fplace=expression();
if(syn==28) //得到(
scaner();
else
{
printf("error on ')' !\n");
kk=1;
getch();
exit(0);
}
}
else
{
printf("error on '(' !\n");
kk=1;
getch();
exit(0);
}
return (fplace);
}
//該函數回送一個新的臨時變數名,臨時變數名產生的順序為T1,T2...
char *newtemp()
{
char *p;
char m[8];
p=(char *)malloc(8);

kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='t';
return(p); //設置中間變數名放在一個字元數組中,字元數組的第一個字元為t第二個字元為m表示的數值
}
void scaner()
{
sum=0;
///for(m=0;m<8;m++)
//token[m++]=NULL;
memset(token,0,8);
m=0;
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{
case '<':m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
else if(ch=='=')
{
syn=22;
}
else
{
syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
syn=23;
p--;
}
break;
case ':':m=0;
token[m++] = ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++] = ch;
}
else
{
syn=17;
p--;
}
break;

case '+': syn=13;token[0] = ch; break;
case '-': syn=14;token[0] = ch; break;
case '*': syn=15;token[0] = ch;break;
case '/': syn=16;token[0] = ch;break;
case '(': syn=27;token[0] = ch;break;
case ')': syn=28;token[0] = ch;break;
case '=': syn=25;token[0] = ch;break;
case ';': syn=26;token[0] = ch;break;
case '#': syn=0;token[0] = ch;break;
default: syn=-1;break;
}
}
//該函數是生成一個三地址語句送到四元式表中
void emit(char *result,char *ag1,char *op,char *ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++; //統計有多少個四元式
}

熱點內容
安卓籃球手游在哪裡下 發布:2025-02-10 23:21:55 瀏覽:133
linux改變所有者 發布:2025-02-10 23:04:13 瀏覽:650
源碼曹毅 發布:2025-02-10 23:04:01 瀏覽:582
odbcforsqlserver 發布:2025-02-10 22:26:37 瀏覽:600
區塊鏈數據存儲在那裡 發布:2025-02-10 22:25:48 瀏覽:689
c語言for死循環 發布:2025-02-10 22:24:08 瀏覽:523
蘋果限制訪問初始密碼 發布:2025-02-10 22:21:31 瀏覽:759
為什麼安卓手機一年後卡頓 發布:2025-02-10 22:15:39 瀏覽:732
職工信息管理系統設計c語言 發布:2025-02-10 22:15:30 瀏覽:119
預演算法的理念 發布:2025-02-10 22:15:25 瀏覽:133