『壹』 lex.yy.c(1337) : fatal error C1070: mismatched #if/#endif pair in file 'lex.yy.c'
錯誤提示寫的很明白,預編譯命令中的if需要與endif成對出現才行。你寫了ifndef,那麼在之後就必須有一個endif作為結束才行。
『貳』 如何打開LEX文件
我查了一下, 感覺是不是你在VC++里一些設置步驟還沒做?
在安裝了Parser Generator後,執行以下步驟,即可使VC++編譯和連接由Parser
Generator產生的文件。
1.目錄設置
在VC++中執行以下步驟,每個步驟只執行一次。
(1) 選擇Tools菜單中的Options命令,在屏幕上即會出現Options對話框。
(2) 選擇Directories選項卡。
(3) 在Show Directories for下拉列表框中選擇Include Files。
(4) 在Directories框中,點擊最後的空目錄,並填入Parser Generator的include
子目錄的路徑。
(5) 在Show Directories for下拉列表框中選擇Library Files。
(6) 在Directories框中,點擊最後的空目錄,並填入Parser Generator的
lib\msdev子目錄的路徑。
(7) 在Show Directories for下拉列表框中選擇Source Files。
(8) 在Directories框中,點擊最後的空目錄,並填入Parser Generator的Source
子目錄的路徑。
(9) 點擊OK按鈕,Options對話框將接受設置並關閉。
VC++在就可以找到包含文件yacc.h和lex.h以及YACC和Lex的庫文件。
2.項目設置
對於每個VC++項目,都需在VC++中執行以下步驟:
(1) 選擇Project菜單中的Settings命令,在屏幕上即會出現Project Settings對
話框。
(2) 在Settings for下拉列表框中選擇Win32 Debug。
(3) 選擇C/C++標簽。
(4) 在Category下拉列表框中選擇General。
(5) 在Preprocessor Definitions框中,在當前文本的最後,輸入YYDEBUG。
(6) 選擇Link標簽。
(7) 在Category下拉列表框中選擇General。
(8) 在Object/Library Moles框中,在當前文本的後面,輸入yld.lib //這里好象實際使用中不包括後面兩個庫
ylmtd.lib ylmtdlld.lib。
(9) 在Settings for下拉列表框中選擇Win32 Release。
(10) 重復第8步的工作。
(11) 點擊OK按鈕,Project Settings對話框將接受設置並關閉。
VC++現在可以從特定的庫中接受YACC和Lex所需的函數和變數。
3.應用
(1)在Parser Generator下的編輯窗口輸入YACC源程序(擴展名必須為.y)。
(2)用Parser Generator下的Project菜單的Compile file命令編譯源程序,生成相應的C
語言源程序(.cpp)。
(3)用VC++編譯,連接C語言源程序,生成可執行程序(.exe)後即可執行。
『叄』 古羅馬法的思想
德國著名的法學家耶林說:「羅馬帝國曾三次征服世界,第一次以武力,第二次以宗教,第三次以法律。武力因羅馬帝國的滅亡而消亡,宗教隨人民思想覺悟的提高、科學的發展而縮小了影響,惟有法律征服世界是最為持久的征服。」羅馬帝國不僅在當時成就了並遠播了古代社會最發達、最完備的法律體系——羅馬法,而且,整個中世紀西歐法學智識的發端與發展就是一部羅馬法的詮釋與發展史。在古代羅馬遺留給後世的諸多遺產中,羅馬法無疑是其中最重要的一項,其影響逾千年而不衰。
以歷史的長時段鍛造羅馬法。正如羅馬城不是一天造起來的一樣,羅馬法也不是一夜之間驟成的。從公元前451年至前450年間的羅馬的第一部成文法《十二表法》的問世,到公元530年至533年完成的《國法大全》中的《優士丁尼法典》、《學說匯纂》和《法學階梯》為止,羅馬法歷經了一千餘年的發展。它從最初一種狹小和簡陋的農村共同體的法,發展成一種強大的城邦國家的法,進而發展成一種帝國的法。羅馬法的發展與完善,有賴於多項因素,撇開政治的、經濟的這些宏大的背景性的動因不論,僅就法本身來看,在一千餘年的時間跨度中,羅馬法從粗陋質朴走向精細縝密,有賴於法學家窮經皓首地著書立說,親力親為地解答、撰約、協助訴訟,條分縷析地對每一項法律規則的討論與爭鳴;有賴於裁判官通過擬制訴訟和擴用訴訟的方式,在司法實踐中擬制某種法定要素,或參照已有的法定訴訟形式,對社會中新衍生出的而立法又來不及規定專門的司法救濟手段的情況和關系,以具體、靈活、變通的做法提供司法保護,以至於裁判官法成為市民法的活的聲音;還有賴於普通社會民眾的參與與推進。可以說,羅馬法諸項法律規則的形成,發端於當事人對糾紛的提起,確定於裁判官的裁決與處理,抽象化、理論化於法學家的著述。由羅馬法的發展歷程我們不難發現,法律規則、法律制度、法律理念乃至法學傳統的形成,必須假以時日,不可能百十年間一蹴而就。在一千多年的時光流轉中,那些對日常生活的持之以恆的關注,那些對因社會變遷而引發的新問題、新挑戰的不斷的回應,那些對司法實踐的一再的審慎的反思,最終沉澱為了一種規則體系、一種邏輯體系和一種意義體系。不誇張地說,羅馬法系積千年人類生活經驗和理性智慧鍛造而成的。
以追求藝術的精細與完美之心雕琢羅馬法。古代羅馬法並不單純是法條文本、皇帝敕令或法學家的解答與著述的集合物,超乎文本和法典之上的是法的精神與法的理念,從中我們可以明白無誤地發現,羅馬人不是僅僅把法律作為經時務世的技術工具,而是將法律作為體現了一定價值觀念的藝術來對待的。公元1世紀初期的法學家P?J?塞爾蘇斯定義道:「法(ius)是善良和公正的藝術」。優士丁尼的《學說匯纂》中注稱:善良指合乎道德,公正即合乎正義。由此又引申出,「法」當是符合正義的。烏爾比安指出:法律是關於神和人的學問——是關於公正和不公正的科學;法的箴言不是別的,就是誠實生活、不害他人、各得其所。這些是古代社會對法和法學最精練的概括與說明。由此,有學者斷言:「羅馬法是歐洲文化史上最偉大的精神力量之一」(薩拜因)。
羅馬法的實踐性和藝術性相結合的一面,體現在流傳甚廣的諸多法律格言中。這些法律格言涉及各個方面。在法的一般理論方面的格言有:法不是針對個別人的,而是為所有人普遍創設的;法律應當能被所有人理解;通曉法律不在於了解它的文字表述,而在於掌握它的精神和實質;違反法律原則的規定不應得到因循;習慣是法律的最好解釋者;法則產生於事實;對法的不知是不可原諒的;任何人不得通過損害他人的方式為自己獲利;行使自己的權利以不損害他人權利為限等。在刑法方面的格言有:刑罰應當成為對人的改造;法律考慮激憤者,激憤者卻不考慮法律(指刑法一般對在激憤狀態中實施犯罪行為的人減輕處罰);疑罪從無;任何人均無義務指控自己有罪等。在私法方面的格言有:公法不得被私人簡約變通;契約起源於意願,隨後變為必須遵守的義務;和解協議相當於已決案;不得要求任何人履行不可能的給付;不得推定任何人遺棄自己的財產物;不情願者之間締結不了婚姻等。在程序方面的格言有:訴訟只不過是通過審判獲取應得之物的權利;沒有原告就沒有法官;法官不得自動審判;審判員不得審理與己有關的案件;法官只知法,事實須證明;舉證的義務由主張者而不是否認者承擔;一目瞭然之事無須證明;單一證據不能證明,與其他證據相結合可以證明;判決應當與請求相對應;一事不再理等。我們還很難發現其他哪個民族有如此豐富的法律格言。而且,這些格言不是類似於我國古代宋、明、清時期的律學讀本或訟師秘本中的僅僅是方便記誦的法律歌謠,而是對法律規則高度濃縮化後的藝術錘煉的結晶。今天,透過這些格言,我們仍能夠領略到規則背後的信念。今天,也仍有法學家堅持這樣的見解:「在任何時代中,法的確定性都是通過如下方面得到保證:一是法律藝術,它居於統治地位;二是法學,它的任務局限於形成法的技術因素……;三是立法,它相對於法學只能居於次位,其任務是構成法的政治因素。以信仰鞏固和弘揚羅馬法。在古代羅馬,指稱「法」的有兩個詞:ius和Lex。ius指自然形成的法與習俗,它本身即含有潛在的完善性,是所有人定法Lex的正當性源泉。而lex則專指由世俗權力機構制定、認可的人定法或曰制定法。Lex的含義比ius要狹窄,Lex的中心意義是命令。西塞羅把Lex稱為「有關命令和禁止的正確理性」。五大法學家之一的莫德斯丁則說,法律(Lex)的效力在於命令、禁止、允許和懲罰。制定法(Lex)要盡可能地遵循、符合自然的固有的法與習俗(ius)。羅馬法的這一觀念我們簡言之謂「自然法觀念」。
自然法觀念為羅馬法的被信仰奠定了道德基礎。對於這一觀念,西塞羅有過美妙的闡述:
「真正的法律是與自然相一致的正確理性;它適用於所有人且不變而永恆,……對於真正的法律,其神聖性不可能被貶低,其合法性不可能被扭曲,其效力不可能被廢止;我們不能通過元老院抑或公民大會的命令來驅逐它,我們無須訴諸任何人來確定和解釋它;若是真正的法,……它是唯一而一同的法,永恆而不可改變,約束所有時代的所有民族;……對永恆的法的違反即是對人自己以及人的本性的違背,因此,誰若違背之,哪怕他逃避了對他的行為作出的其他相應懲罰,也將受到最嚴厲的處罰。」
在此基礎上,西塞羅陳述了法律至上原則:
「環顧我們國家中的其他部分,你會發現一切都依照規則和法律的規定而運轉。」
「在一個以法律為根基的國度,棄法律於不顧的行徑將會是更大的恥辱。因為法律是維系個人在共同體中的利益的紐帶,是我們得享自由的基礎,是正義的源頭……沒有法律的國家猶如缺失頭腦的人體……執政官司掌法律之執行,法官照看法律之解釋。總而言之,我們遵守法律,是因為法律賦予我們自由。」
如果說西塞羅的觀念多少還帶有某種永恆的神聖的色彩的話,那麼羅馬法中實踐性的自然法及信仰法律的例子亦俯拾可得:例如《十二表法》自從頒行後,千年間幾乎未經任何改動,也從未被宣布廢止過,它一直居於准神聖的地位;又如,羅馬最早的一些法學家,把解釋法律當作對社會公共生活的貢獻,他們公開和無償地提供法律咨詢,同時在此過程中完善自己,努力追求法律智慧與道德正義感相統一的高尚的倫理形象。直至烏爾比安時代,法學家仍把法律職業看作是獻身於人類的善好生活的神職人員的工作。
法律被信仰,在古代羅馬不僅是一種觀念,也是一種實踐。
『肆』 LEX的描述過濾C代碼中注釋符/**/的語句是什麼
Boa是一種非常小巧的Web伺服器,其可執行代碼只有大約60KB左右。作為一種單任務Web伺服器,Boa只能依次 完成用戶的請求,而不會fork出新的進程來處理並發連接請求。但Boa支持CGI,能夠為CGI程序fork出一個進程來執行。Boa的設計目標是速度 和安全。下面給大家介紹一下Boa伺服器移植的具體操作步驟,希望能夠有幫助。環境主機:ubuntu8.10交叉工具鏈:gcc-3.4.5-glibc-2.3.6目標:s3c2410開發板結合網上一些文檔,整理了一個比較完整的文檔。1.下載Boa源碼下載地址: 最新發行版本: 0.94.13下載 boa-0.94.13.tar.gz解壓:# tar xzf boa-0.94.13.tar.gz2.安裝需要工具bison,flexsudo apt-get install bison flex否則會出現如下錯誤make: yacc:命令未找到make: *** [y.tab.c] 錯誤 127make: lex:命令未找到make: *** [lex.yy.c] 錯誤 1273.修改文件(1)修改 src/compat.h找到#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff修改成#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff否則會出現錯誤:util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token make: *** [util.o] 錯誤 1(2)修改 src/log.c注釋掉if (p2(error_log, STDERR_FILENO) == -1) 為:/*if (p2(error_log, STDERR_FILENO) == -1) */否則會出現錯誤:log.c:73 unable to p2 the error log:bad file deor(3)修改src/boa.c注釋掉下面兩句話:if (passwdbuf == NULL) if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) 為#if 0if (passwdbuf == NULL) if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) #endif否則會出現錯誤:boa.c:211 - getpwuid: No such file or directory注釋掉下面語句:if (setuid(0) != -1) 為#if 0if (setuid(0) != -1) #endif否則會出現問題:boa.c:228 - icky linux kernel bug!: No such file or directory4、生成Makefile文件執行:#cd boa-0.94.13/src#./configure5、修改Makefilecd srcvim Makefile修改CC = gcc 為 CC = arm-softfloat-linux-gnu-gcc修改CPP = gcc -E 為 CC = arm-softfloat-linux-gnu-gcc -E6、編譯makels -l boa-rwxr-xr-x 1 david david 189223 2009-05-31 13:44 boa然後為生成的二進制文件boa瘦身arm-softfloat-linux-gnu-strip boals -l boa-rwxr-xr-x 1 david david 61052 2009-05-31 13:51 boa可以發現boa的大小前後差距很大這為我們節省了很大的空
『伍』 《死亡空間:撤離》的劇情什麼要非常詳細的。
玩不上Wii,於是在網上搜了一下全通關過程視頻,劇情方面為銜接在動畫之後,前作之前。
游戲開始Lex與男友Sam通話,Lex似乎預感到了神跡的不祥,但是男友Sam卻滿不在乎,Lex勸告男友:如果缺乏想像力,很可能自身陷入險境。之後游戲以Sam的視角開始,Sam的小隊幾人負責運送神跡到石村號上,然而過程中隊員們的精神逐漸受到侵蝕,最後只剩下Sam、隊長和另外一個隊員。三人一路行動中,隊長忽然聽到某處的求救聲(實際上是精神侵蝕的反應),於是與隊員分開前去營救,Sam則和同伴繼續前行。行進中同伴精神也被侵蝕,Sam不得已殺死了他。這時Lex發來信息說發生事故,Colonial的氧氣含量在下降,Sam前去進行補救,而過程中Sam開始逐漸出現更多幻覺。最後眼看要到達電梯口時看到了Nate和Weller乘電梯下來,並且開槍射殺了Sam。臨終前Sam聽到了Nate說:你為什麼要這么做?
鏡頭回到Nate處,Nate通過自我介紹說明了自己是負責調查這次事件的偵探,Weller在介紹了大致情況以後分配了一個人和他們一起行動(游戲中貌似一直叫他Rookie,就是新手),幾人進入停屍房調查,然後幾人發現停屍房的屍體不翼而飛,大夫也開始發瘋攻擊別人。一路不得已殺出來,最後那個新人也受到精神侵蝕被Nate所殺,兩人發現已經失控,必須先返回總部。然而總部的情況也一團糟,當再度返回時,發現總部已經成為了地獄,在那裡他們發現了多起來的Lex,Lex稱自己的父親、男友都失蹤了,並且決議要和兩人一起走。Weller要Lex留下把自己鎖在家裡等待救援,Nate卻決定帶上Lex,之後三人一起行動。途中遇到了Ekheart,此人自稱為商人,來Colonial處理私人業務,並且說這里有逃生船可以前往石村號求救,於是四人一起行動,一路向逃生艙進發。
四人進入逃生艙後,巨大的怪物(前作的最終boss的一部分)一直追逐他們,索性最後逃生成功,在沖過隕石群後,救生艇終於靠近石村號。然而石村號卻禁止他們進入,並且立刻發起攻擊,不得已,四人硬闖入防禦圈,強制進入了石村號。然後石村號的情況也好不到哪去,裡面和Colonial已經沒有兩樣。之後幾人在行動中遇到了倖存的保安小隊,並且將他們帶到了醫療室,在那裡,他們遇到前作主角Issac的女朋友Nichole(此處的Nichole顯得比前作反倒老練、成熟),Nichole在給眾人做了檢查後說他們沒事,Lex決定要逃離石村號,並且問是否有救生艇,之後眾人行動前去尋找。
(游戲過程若干)
來到船長室後,眾人發現船長已死。之後眾人來到保安室,在這里Nichole決定留下幫助其他人,而Nate、Weller、Eckheart和Lex則繼續行動。來到鐵軌穿梭處的時候,眾人發現穿梭機(就是前作用來過關的火車)沒了,Weller決定步行走鐵路,雖然Eckheart極力反對,但是最後不得已還是一起走了。半途中因為鐵路坍塌,幾人落入下水道。在下水道中一陣摸索,Lex被突然襲擊的小蟲纏繞不慎落入水中,Nate找不到她,Eckheart對此好像非常失落,並對Nate說:你應該保護她!之後三人繼續行進。在中央水道中遇到了生物博士(忘記名字了),就在他們要去與博士會合之際,巨大怪物從水下出現,博士暫時撤離,三人力戰之後(確切的說是兩人),boss倒地,繼續行進。。。。。
鏡頭轉到博士處,博士開始單槍匹馬撤離,因為她發現水下防衛系統也被突破。撤離途中遇到了受傷的Lex,她僥幸活著跑了出來,Lex聽說博士遇到了Nate三人,決定去找他們,而博士說沒人能在遇到那種怪物的情況下生還,於是改為直接向救生艙行進(這里有一個小boss戰,在前作中不是boss,就是把那個黑人隊長撕碎的那個大塊頭)。在中央控制室,博士和Lex遇到了Nate三人,在這里Eckheart諷刺博士見死不救,而Nate的一句話也很有諷刺意義:如果是你你也會跑的。果然不出Nate所料,幾人決定前往穿梭機處,博士負責調整整個系統,Nate、Weller以及Lex先過去,Eckheart留下保護博士。過程中,博士發現了Eckheart其實是Unitology的人,並且與其發生爭吵,突然怪物的觸手抓住了博士,Eckheart不但沒有相救,反而鎖死了大門自己跑掉了,之後還在Nate三人面前裝作是無能為力的樣子。
四人乘坐穿梭機來到救生艇處,Weller和Eckheart一組前去啟動救生艇,而Nate和Lex一組(忘記干什麼去了。。。。),之後主視角為Weller,游戲中別指望Eckheart會幫你,他一槍都不開,起碼Lex還能幫助Nate打一打,Eckheart是個十足的jerk。兩人來到控制室,一個膽小的士兵把自己鎖在控制室里,並說沒有長官回來他絕不開門,Weller在外面奮力廝殺,士兵卻堅持不開門,就在此時,一個怪物出現(左手代炸葯的那種),直接炸死了士兵並且炸碎了玻璃,兩人進入控制室,卻發現一片狼藉,而安全系統也被鎖死,需要切斷電源。Weller便隻身前往切斷電源,回來以後他也發現了Eckheart的秘密,Eckheart在留下的錄像上說明了自己是Unitology的卧底,並且他發現Lex能免疫神跡的精神侵蝕,打算拿她去做研究(這也是為什麼之前他很關心Lex)。 Eckheart為了保守秘密開槍射傷了Weller,而就在自己正得意之時,被身後的怪物襲擊殺死,Weller傷痛中撿起地上的槍幹掉了怪物。。。。
鏡頭再次回到Nate處,兩人一下穿梭機,就在連線視頻上看到了Nichole留給Issac的臨終影像,包括自己自殺的畫面。絕望的Lex和Nate繼續前進,經歷一系列波折後終於來到控制室與Weller會和,卻發現Weller身受重傷,Eckheart也掛了。Weller說出了為什麼殺 Eckheart,然後保留了Lex免疫精神侵蝕的秘密。之後Weller交代石村號的防禦系統還在進行,如果不停止無法逃跑。Nate命令Lex留下照顧Weller,自己隻身前往防禦室停止防禦炮。沿途中Nate也開始出現嚴重的幻覺,有幾處效果處理得很強,相當震撼,不過不影響游戲。最後經過了甲板(前作中落隕石群的地方,稍微沒飛好就粉身碎骨,這做中只有怪物,沒有隕石)。控制室里一陣血戰後,終於停止了防禦炮。返回途中,Nate遇到了最終 boss,解決後就在快要到達門邊時,突然飛來的碎片扎入了Nate的手,並且直接將Nate固定在了甲板上。面臨陽氣不足的情況下,Nate果斷地(其實是玩家自己切。。。。)斷手並且進入了石村號。
鏡頭再次回到Weller處,Lex對其細微的照顧使其止住了傷,並且能再次活動,在聯系了幾次Nate沒有回話後,憤怒的Lex摔碎了通訊器,並說絕不會讓她周圍的人白白死掉。之後兩人前往救生艇,然而沒人會操縱,於是Lex只能進去琢磨,而Weller在門口掩護她,這里要打很長時間的怪。千鈞一發之際,Nate殺了回來。幾人立刻關上艙門,最終逃離了石村號,Nate也聲稱之後自己就退休了。此時接收到了前作Issac乘坐的飛船的訊號,盡管Lex一再警告不要進入石村號,然而通訊的不穩定使對方沒能聽到,Weller漸漸陷入了沉睡。
結局:
最後畫面是精神侵蝕後的Nate的視角並襲擊了Lex。
關於結局看到三種說法:
1.Nate確實是變成了怪物並且殺死了Lex
2.一切只是一場夢
3.Nate變成了怪物,但是最後時刻Lex從旁邊拿過了槍,這也是為什麼最後一瞬間屏幕白了,因為Nate掛了。。。
『陸』 python怎樣使用解釋器
大學里計算機科學最吸引我的地方就是編譯器。最神奇的是,編譯器是如何讀出我寫的那些爛代碼,並且還能生成那麼復雜的程序。當我終於選了一門編譯方面的課程時,我發現這個過程比我想的要簡單得多。
在本系列的文章中,我會試著通過為一種基本命令語言IMP寫一個解釋器,來展示這種簡易性。因為IMP是一個簡單廣為人知的語言,所以打算用 Python寫這個解釋器。Python代碼看起來很像偽代碼,所以即使你不認識 Python,你也能理解它。解析可以通過一套從頭開始實現的解析器組合完成(在本系列的下一篇文章中會有解釋)。除了sys(用於I/O)、re(用於解析正則表達式)以及unittest(用於確保一切工作正常)庫,沒有使用其他額外的庫。
IMP 語言
在開始寫之前,我們先來討論一下將要解釋的語言。IMP是擁有下面結構的最小命令語言:
賦值語句(所有變數都是全局的,而且只能存儲整數):
Python
1
x := 1
條件語句:
Python
1
2
3
4
5
if x = 1 then
y := 2
else
y := 3
end
while循環:
Python
1
2
3
while x < 10 do
x := x + 1
end
復合語句(分號分隔):
Python
1
2
x := 1;
y := 2
OK,所以它只是一門工具語言,但你可以很容易就把它擴展成比Lua或python更有用的語言。我希望能把這份教程能保持盡量簡單。
下面這個例子是計算階乘的程序:
Python
1
2
3
4
5
6
n := 5;
p := 1;
while n > 0 do
p := p * n;
n := n - 1
end
IMP沒有讀取輸入的方式,所以初始狀態必須是在程序最開始寫一系列的賦值語句。也沒有列印結果的方式,所以解釋器必須在程序的結尾列印所有變數的值。
解釋器的結構
解釋器的核心是「中間表示」(Intermediate representation,IR)。這就是如何在內存中表示IMP程序。因為IMP是一個很簡單的語言,中間表示將直接對應於語言的語法;每一種表達和語句都有對應的類。在一種更復雜的語言中,你不僅需要一個「語法表示」,還需要一個更容易分析或運行的「語義表示」。
解釋器將會執行三個階段:
將源碼中的字元分割成標記符(token)
將標記符組織成一棵抽象語法樹(AST)。抽象語法樹就是中間表示。
評估這棵抽象語法樹,並在最後列印這棵樹的狀態
將字元串分割成標記符的過程叫做「詞法分析」,通過一個詞法分析器完成。關鍵字是很短,易於理解的字元串,包含程序中最基本的部分,如數字、標識符、關鍵字和操作符。詞法分析器會除去空格和注釋,因為它們都會被解釋器忽略。
實際執行這個解析過的抽象語法樹的過程稱為評估。這實際上是這個解析器中最簡單的部分了。
本文會把重點放在詞法分析器上。我們將編寫一個通用的詞彙庫,然後用它來為IMP創建一個詞法分析器。下一篇文章將會重點打造一個語法分析器和評估計算器。
詞彙庫
詞法分析器的操作相當簡單。它是基於正則表達式的,所以如果你不熟悉它們,你可能需要讀一些資料。簡單來說,正則表達式就是一種能描述其他字元串的特殊的格式化的字元串。你可以使用它們去匹配電話號碼或是郵箱地址,或者是像我們遇到在這種情況,不同類型的標記符。
詞法分析器的輸入可能只是一個字元串。簡單起見,我們將整個輸入文件都讀到內存中。輸出是一個標記符列表。每個標記符包括一個值(它代表的字元串)和一個標記(表示它是一個什麼類型的標記符)。語法分析器會使用這兩個數據來決定如何構建一棵抽象語法樹。
由於不論何種語言的詞法分析器,其操作都大同小異,我們將創建一個通用的詞法分析器,包括一個正則表達式列表和對應的標簽(tag)。對每一個表達式,它都會檢查是否和當前位置的輸入文本匹配。如果匹配,匹配文本就會作為一個標記符被提取出來,並且被加上該正則表達式的標簽。如果該正則表達式沒有標簽,那麼這段文本將會被丟棄。這樣免得我們被諸如注釋和空格之類的垃圾字元干擾。如果沒有匹配的正則表達式,程序就要報錯並終止。這個過程會不斷循環直到沒有字元可匹配。
下面是一段來自詞彙庫的代碼:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import re
def lex(characters, token_exprs):
pos = 0
tokens = []
while pos < len(characters):
match = None
for token_expr in token_exprs:
pattern, tag = token_expr
regex = re.compile(pattern)
match = regex.match(characters, pos)
if match:
text = match.group(0)
if tag:
token = (text, tag)
tokens.append(token)
break
if not match:
sys.stderr.write('Illegal character: %sn' % characters[pos])
sys.exit(1)
else:
pos = match.end(0)
return tokens
注意,我們遍歷正則表達式的順序很重要。lex會遍歷所有的表達式,然後接受第一個匹配成功的表達式。這也就意味著,當使用詞法分析器時,我們應當首先考慮最具體的表達式(像那些匹配運算元(matching operator)和關鍵詞),其次才是比較一般的表達式(像標識符和數字)。
詞法分析器
給定上面的lex函數,為IMP定義一個詞法分析器就非常簡單了。首先我們要做的就是為標記符定義一系列的標簽。IMP只需要三個標簽。RESERVED表示一個保留字或操作符。INT表示一個文字整數。ID代表標識符。
Python
1
2
3
4
5
import lexer
RESERVED = 'RESERVED'
INT= 'INT'
ID = 'ID'
接下來定義詞法分析器將會用到的標記符表達式。前兩個表達式匹配空格和注釋。它們沒有標簽,所以 lex 會丟棄它們匹配到的所有字元。
Python
1
2
3
token_exprs = [
(r'[ nt]+',None),
(r'#[^n]*', None),
然後,只剩下所有的操作符和保留字了。記住,每個正則表達式前面的「r」表示這個字元串是「raw」;Python不會處理任何轉義字元。這使我們可以在字元串中包含進反斜線,正則表達式正是利用這一點來轉義操作符比如「+」和「*」。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(r':=', RESERVED),
(r'(',RESERVED),
(r')',RESERVED),
(r';', RESERVED),
(r'+',RESERVED),
(r'-', RESERVED),
(r'*',RESERVED),
(r'/', RESERVED),
(r'<=',RESERVED),
(r'<', RESERVED),
(r'>=',RESERVED),
(r'>', RESERVED),
(r'=', RESERVED),
(r'!=',RESERVED),
(r'and', RESERVED),
(r'or',RESERVED),
(r'not', RESERVED),
(r'if',RESERVED),
(r'then',RESERVED),
(r'else',RESERVED),
(r'while', RESERVED),
(r'do',RESERVED),
(r'end', RESERVED),
最後,輪到整數和標識符的表達式。要注意的是,標識符的正則表達式會匹配上面的所有的保留字,所以它一定要留到最後。
Python
1
2
3
(r'[0-9]+',INT),
(r'[A-Za-z][A-Za-z0-9_]*', ID),
]
既然正則表達式已經定義好了,我們還需要創建一個實際的lexer函數。
Python
1
2
def imp_lex(characters):
return lexer.lex(characters, token_exprs)
如果你對這部分感興趣,這里有一些驅動代碼可以測試輸出:
Python
1
2
3
4
5
6
7
8
9
10
11
import sys
from imp_lexer import *
if __name__ == '__main__':
filename = sys.argv[1]
file = open(filename)
characters = file.read()
file.close()
tokens = imp_lex(characters)
for token in tokens:
print token
繼續……
在本系列的下一篇文章中,我會討論解析器組合,然後描述如何使用他們從lexer中生成的標記符列表建立抽象語法樹。
如果你對於實現IMP解釋器很感興趣,你可以從這里下載全部的源碼。
在源碼包含的示例文件中運行解釋器:
Python
1
python imp.py hello.imp
運行單元測試:
Python
1
python test.py
『柒』 古希臘,古羅馬法律的特點是什麼
古希臘法律思想的特點:
一、濃厚的城邦主義色彩
古希臘的法律思想就是從城邦之中產生的,因而也強烈地受到城邦的制約,可以說,城邦是古希臘所有思想家法律思想的出發點和歸宿。
二、顯著的自然主義傾向
古希臘城邦自然產生的特點使法律思想家的思想帶有明顯的自然主義傾向。「與自然和諧一致的生活」是他們追求的生存目標。
三、法律思想對哲學思想和倫理思想具有依附性
古希臘沒有獨立的政治學和法學,在相當長的時期,政治學和法學都是依附於哲學和倫理學之中。所以,古希臘的法律思想表現出對哲學思想和倫理思想具有較大的依附性。
四、政治問題和法治問題研究相對發達
古希臘思想家特別關注政體問題的法治問題,這構成古希臘法律思想的又一特色,促進了古希臘早期民主制的形成和發展。
=======
所謂羅馬法,一般乏指羅馬奴隸制國家的全部法律,存在於羅馬奴隸制國家的整個歷史時期。它既包括自羅馬國家產生至西羅馬帝國滅亡這個時期的法律,也包括公元7世紀以前羅馬帝國的法律。從公元前451年至前450年間羅馬的第一部成文法《十二表法》問世,到公元530年至533年完成的《國法大全》中的《優士丁尼法典》、《學說匯纂》和《法學階梯》為止,羅馬法歷經了一千餘年的發展。它從最初一種狹小和簡陋的農村共同體的法,發展成一種強大的城邦國家的法,進而發展成一種帝國的法。古羅馬法律實際上是一個學習、傳播、應用希臘自然法思想的過程。羅馬人不僅僅把法律作為經時務世的技術工具,而是將法律作為一種體現價值觀念的藝術來對待的。如公元1世紀初期的法學家塞爾蘇斯定義道:「法(ius)是善良和公正的藝術」;羅馬最早的一些法學家,把解釋法律當作對社會公共生活的貢獻,努力追求法律智慧與道德正義感相統一的高尚的倫理形象。
在古羅馬,指稱「法」的有兩個詞:ius和Lex。ius指自然形成的法與習俗,它本身即含有潛在的完善性,是所有人定法Lex的正當性源泉。而lex則專指由世俗權力機構制定、認可的人定法或曰制定法。Lex的含義比ius要狹窄,Lex的中心意義是命令。西塞羅把Lex稱為「有關命令和禁止的正確理性」。五大法學家之一的莫德斯丁則說,法律(Lex)的效力在於命令、禁止、允許和懲罰。制定法(Lex)要盡可能地遵循、符合自然的固有的法與習俗(ius)。這一觀念我們簡言之曰「自然法觀念」。
『捌』 linux命令語法結構
以-開頭的:開關(switch),可以多個開關選項並在一起,比如tar -xjvf test.tar.bz2;
[ ]:可選的參數,就是說如果你不需要那個參數對應的功能就可以不用那個參數;
< > :被替換的部分,通常是必須有的,比如tar -xjvf <你要解壓縮的bz2檔案的文件名>
|:「或者」之意。注意不要和shell符號||和|搞混了啊;
{ }:……樓主此例中好像沒用花括弧啊-_-||……
/:就是說你如果使用了prefixlex要在前面加上/符號。
希望對你有用!
PS:Linux中大多數命令都是服從上述規范編寫的。但是注意一些古老的工具,如ps、tar,如下的命令調用也是合法的:
tar xjvf test.tar.bz2
ps ef
『玖』 lexpore.exe-應用程序錯誤
你好,電腦出現:【該內存不能為read】,這是你安裝的「軟體」和電腦中的「內存」有沖突!
【答案原創,引用請說明作者:力王歷史】,偶然出現,點【取消】即可!
1。電腦里有【木馬或病毒】干擾,下載「360安全衛士」和「360殺毒雙引擎版」或「金山衛士」和「金山毒霸」,建議「全盤掃描」病毒和木馬,修補電腦上的「高危」和「重要」的【系統漏洞】!【系統修復】,一鍵修復!【插件清理】,立即清理【惡評插件】!
2。【可疑啟動項】,下載「360系統急救箱」,或打開360安全衛士,【功能大全】里的「360系統急救箱」,開始急救,完畢後,重啟電腦!開機後,【文件恢復區】,點開:可疑啟動項和木馬,徹底刪除文件!
再:【系統修復】,全選,立即修復!【網路修復】,開始修復。重啟電腦!
【金山急救箱】,勾選【擴展掃描】,立即掃描,完畢後,立即處理,重啟電腦!
3。你下載的「播放器」,或「聊天軟體」,或「IE瀏覽器」,或「游戲」的【程序不穩定】,或者「版本太舊」!建議卸掉,下載新的,或將其升級為【最新版本】!IE瀏覽器,和測試版軟體不推薦升級!
4。就是你安裝了兩款或兩款以上的同類軟體(如:兩款播放器,兩款qq,或多款瀏覽器,多款殺毒軟體,多款網游等等)!它們在一起【互不兼容】,卸掉「多餘」的那一款!
5。你在電腦左下角「開始」菜單里找到【強力卸載電腦上的軟體】,找到多餘的那款卸掉! 卸完了再「強力清掃」(看準了再卸,別把有用的卸了)!完畢後,重啟電腦!
6。再不行,開始菜單,運行 ,輸入cmd, 回車,在命令提示符下輸入【復制即可】 :
for %1 in (%windir%\system32\*.ocx) do regsvr32 /s %1
粘貼,回車,完畢後,再輸入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
回車!直到屏幕滾動停止為止,重啟電腦!
7。再不行,去網上下載一個【read修復工具】,修復一下試試!注意查殺一下病毒和木馬!
8。重啟電腦,開機出完電腦品牌後,按「F8」,進到「安全模式」,游標選定:【最後一次正確設置】,回車,回車,看看效果如何!
實在不行就:【一鍵還原系統或重裝系統】!
『拾』 lex.yy.c 如何生成
需要有flex插件才可以用這個指令,flex.exe