atitit.词法分析的实现token attilax总结
?
atitit.詞法分析的實(shí)現(xiàn)token?attilax總結(jié)
?
1.?詞法分析(英語:lexical?analysis)跟token 1
1.1.?掃描器 2
2.?單詞流必須識(shí)別為保留字,標(biāo)識(shí)符(變量),常量,操作符(運(yùn)算符?)和界符五大類 2
2.1.?操作符(運(yùn)算符?)::: 3
2.2.?4.界符:“;”分號(hào),“{}”大括號(hào),單引號(hào),雙引號(hào) 3
3.??如何進(jìn)行詞法分析? 3
3.1.?使用Fsm狀態(tài)機(jī)(自動(dòng)機(jī)) 3
4.?詞法分析器框架選型 4
4.1.?語法分析器 4
4.2.?lex 4
4.3.?flex詞法分析器 4
4.4.?1?????ANTLR簡介 5
4.5.?antlr韓式javacc 5
4.6.?Antlr?簡介 6
5.?參考 6
?
1.?詞法分析(英語:lexical?analysis)跟token
是計(jì)算機(jī)科學(xué)中將字符序列轉(zhuǎn)換為單詞(Token)序列的過程。進(jìn)行詞法分析的程序或者函數(shù)叫作詞法分析器(Lexical?analyzer,簡稱Lexer),也叫掃描器(Scanner)。詞法分析器一般以函數(shù)的形式存在,供語法分析器調(diào)用。
?
這里的單詞是一個(gè)字符串,是構(gòu)成源代碼的最小單位。從輸入字符流中生成單詞的過程叫作單詞化(Tokenization),在這個(gè)過程中,詞法分析器還會(huì)對(duì)單詞進(jìn)行分類。
詞法分析器通常不會(huì)關(guān)心單詞之間的關(guān)系(屬于語法分析的范疇),舉例來說:詞法分析器能夠?qū)⒗ㄌ?hào)識(shí)別為單詞,但并不保證括號(hào)是否匹配。
詞法分析(lexical?analysis)或掃描(scanning)是編譯器的第一個(gè)步驟。詞法分析器讀入組成源程序的字符流,并且將它們組織成有意義的詞素(lexeme)的序列,并對(duì)每個(gè)詞素產(chǎn)生詞法單元(token)作為輸出。
?
簡單的來說,詞法分析就是將源程序(可以認(rèn)為是一個(gè)很長的字符串)讀進(jìn)來,并且“切”成小段(每一段就是一個(gè)詞法單元?token),每個(gè)單元都是有具體的意義的,例如表示某個(gè)特定的關(guān)鍵詞,或者代表一個(gè)數(shù)字。而這個(gè)詞法單元在源程序中對(duì)應(yīng)的文本,就叫做“詞素”。
?
token就是把程序的語句進(jìn)行類似分詞得到的單詞。
?
作者::老哇的爪子Attilax艾龍,EMAIL:1466519819@qq.com
轉(zhuǎn)載請(qǐng)注明來源:?http://blog.csdn.net/attilax
?
?
1.1.?掃描器
詞法分析的第一階段即掃描器,通常基于有限狀態(tài)自動(dòng)機(jī)。?掃描器能夠識(shí)別其所能處理的單詞中可能包含的所有字符序列(單個(gè)這樣的字符序列即前面所說的“語素”)。例如“整數(shù)”單詞可以包含所有數(shù)字字符序列。很多?情況下,根據(jù)第一個(gè)非空白字符便可以推導(dǎo)出該單詞的類型,于是便可逐個(gè)處理之后的字符,直到出現(xiàn)不屬于該類型單詞字符集中的字符(即最長一致原則)。
盡管在某些情況下需要手工編寫詞法分析器,一般情況下詞法分析器都用自動(dòng)化工具生成。
?
?
?
HTMLTokenizer的處理,它是利用有窮狀態(tài)自動(dòng)機(jī)來完成詞法解析的,把解碼后的字符串作為輸入,輸出一個(gè)個(gè)的HTMLToken的。
?
?
致可以知道了HTMLToken中其實(shí)就是保存了輸入流中被分出的幾段數(shù)據(jù),這些數(shù)據(jù)會(huì)用于構(gòu)建DOM的節(jié)點(diǎn)。這些數(shù)據(jù)抽象為類型,數(shù)據(jù),屬性結(jié)合的一條記錄。
?
,HTML的詞法分析就是利用HTMLTokenizer中的狀態(tài)機(jī)來實(shí)現(xiàn)的。而HTML的語法分析則是根據(jù)HTMLToken的類型,以及?HTMLTreeBuilder中的狀態(tài)機(jī)來識(shí)別的,然后根據(jù)識(shí)別到的類型情況,來創(chuàng)建一個(gè)具體的Node,并在創(chuàng)建該Node后,把其插入到DOM樹的?相應(yīng)的位置上,完成語法分析,生成一個(gè)DOM樹作為語法樹。
?
2.?單詞流必須識(shí)別為保留字,標(biāo)識(shí)符(變量),常量,操作符(運(yùn)算符?)和界符五大類
?
2.1.?操作符(運(yùn)算符?):::
()?[]?->?.
| ??: | 條件 | 由右向左 |
?
| ()?[]?->?. | 括號(hào)(函數(shù)等),數(shù)組,兩種結(jié)構(gòu)成員訪問 | 由左向右 |
?
| , | 逗號(hào)(順序) | ||
| +?- | 加,減 | 由左向右 | |
?
括號(hào),紡括號(hào)
參考
編譯器DIY——詞法分析?-?GodLike?-?博客頻道?-?CSDN.NET.htm
2.2.?4.界符:“;”分號(hào),“{}”大括號(hào),單引號(hào),雙引號(hào)
3.??如何進(jìn)行詞法分析?
A:?一種很簡單的思路就是,用一個(gè)狀態(tài)保存在處理到各個(gè)字符時(shí)的狀態(tài),比如是標(biāo)識(shí)符或者數(shù)字或者空格等等,直到狀態(tài)改變到可以認(rèn)定是不同token的時(shí)候結(jié)束。
可以肯定的是,必然要對(duì)需要處理的數(shù)據(jù)挨個(gè)字符判斷,然后在恰當(dāng)?shù)奈恢媒財(cái)?#xff0c;得到一個(gè)個(gè)的token.
這里的核心在于將不同符號(hào)對(duì)應(yīng)的字符給區(qū)別開,在一個(gè)字符無法表達(dá)此符號(hào)時(shí)將它截?cái)?#xff0c;token形成。
3.1.?使用Fsm狀態(tài)機(jī)(自動(dòng)機(jī))
?
4.?詞法分析器框架選型
4.1.?語法分析器
4.2.?lex
4.3.?flex詞法分析器
?
以計(jì)算器來舉例,12+34*9?這一段“源程序”的詞法分析過程如下所示:
圖?2?算式的詞法分析過程
一段對(duì)計(jì)算機(jī)來說豪無意義的字符串,經(jīng)過語法分析后就得到了略微有意義的?Token?流。digit?就表示這個(gè)詞法單元對(duì)應(yīng)的是數(shù)字,operator?則表示操作符,后面相應(yīng)的數(shù)字和符號(hào)(粉色背景)就是詞素。同時(shí),程序中一些不必要的空白、注釋也可以由詞法分析器來過濾掉,這樣,之后的語法分析等步驟?處理起來就會(huì)容易得多。
?
使用antlr或者javacc來生成詞法分析器比較簡單,自己寫實(shí)在是很麻煩的事情
開源的LL(K)語法/詞法分析器—ANTLR
?
4.4.?1?????ANTLR簡介
ANTLR—A,?其前身是PCCTS,它為包括Java,C++,C#在內(nèi)的語言提供了一個(gè)通過語法描述來自動(dòng)構(gòu)造自定義語言的識(shí)別器(recognizer),編譯器?(parser)和解釋器(translator)的框架。ANTLR可以通過斷言(Predicate)解決識(shí)別沖突;支持動(dòng)作(Action)和返回?值(Return?Value)來;更棒的是,它可以根據(jù)輸入自動(dòng)生成語法樹并可視化的顯示出來(這一點(diǎn)我將在下面的例子中演示)。由此,計(jì)算機(jī)語言的翻譯變成了一項(xiàng)普通的?任務(wù)—在這之前YACC/LEX顯得過于學(xué)院派,而以LL(k)為基礎(chǔ)的ANTLR雖然在效率上還略有不足,但是經(jīng)過近些年來的升級(jí)修改,使得ANTLR?足以應(yīng)付現(xiàn)存的絕大多數(shù)應(yīng)用。感謝Terence?Parr博士和他的同事們十幾年來的出色工作,他們?yōu)榫幾g理論的基礎(chǔ)和語言工具的構(gòu)造做了大量基礎(chǔ)性工作,也直接導(dǎo)致了俄ANTLR的產(chǎn)生。nother?Tool?for?Language?Recognition
?
正則表達(dá)式?????正則表達(dá)式??被認(rèn)??為??是文本處理的??首選??工具,當(dāng)我們使用正則表??示??式時(shí),??首先??定義??一個(gè)正則表達(dá)式,??然??后??和??預(yù)期??文本??進(jìn)行??匹配??,??最??終再按照??正則表??示??式??中??的??分??組??,??逐??一??獲??取??相匹配??的??數(shù)??據(jù)??,??然??后??再??進(jìn)行下??一??步??的處理(??輸出??、??替??換??等等??)。在??進(jìn)行??比??較復(fù)雜??一些的??問題??時(shí),使用正則表達(dá)式,??整體??處理??過??程比??較漫長??,有時(shí)??為了??處理一個(gè)??問題??,寫??出??的正則表達(dá)式??晦澀難懂??,??很??不??便??于??維護(hù)??。?????詞法分析器?????在?????Antlr???中詞法分析器??使用??了??和語??法分析器??相??同??的??技術(shù)??來??構(gòu)造??,??對(duì)詞法??記??號(hào)?????Token???的??匹配??使用??了??遞歸??下??降??的??策略??,使??得??詞法分析器??具有處理??上下??文??無關(guān)??文??法??的能??力??,??而??正則表達(dá)式??所??能處理的文??法??只包含??正則文??法??(??線性??文??法??),??因此??詞法分析器??可??以??處理??很??多正則表達(dá)式??難??以??處理的??問題??,比如??左括??號(hào)??和??右括??號(hào)??的成??對(duì)??匹配??等??。?????此外??,在?????Antlr???中詞法分析器所??要??匹配??的??詞法??記??號(hào)??,??通??過??相互引??用的??方??式??進(jìn)行??嵌套??和??遞歸??定義??,比正則表達(dá)的??書??寫??更直觀??,??更加便??于??維護(hù)??。?????總??的??來說??,使用?????Antlr???詞法分析器??處理文本和正則表達(dá)式??相??比,處理能??力更??強(qiáng)大,??便??于開發(fā)和??測(cè)試??,在本文的??后續(xù)??部??分中??,我們一起??來??看??一??下??如何使用?????Antlr???詞法分析器??完成抽取、轉(zhuǎn)換、重寫??這??三??類文本處理工作
?
4.5.?antlr韓式j(luò)avacc
?
Antlr百度為您找到相關(guān)結(jié)果約1,640,000個(gè)
是javacc的兩倍...所以,韓式antlr...
?
在文??件??的??第??一??行??使用??兩??個(gè)?????Antlr???的??關(guān)??鍵??字?????lexer?grammar???聲??明??這是一個(gè)??詞法??文??件??,如??
唯??一??需??要??注??意??的是??詞法??的??名稱必須??和文??件??名稱??一??致??,??否??則??Antlr???生??成??詞法分析器??時(shí)??會(huì)??報(bào)錯(cuò)??,??錯(cuò)誤??類??似??于?????SqlExtrator.g?contains?grammar?xxx;?names?must?be?identical??,這??里??統(tǒng)??一使用?????SqlExtrator??。??
4.6.?Antlr?簡介
1.?ANTLR?語言識(shí)別的一個(gè)工具?(ANother?Tool?for?Language?Recognition?)?是一種語言工具,它提供了一個(gè)框架,可以通過包含?Java,?C++,?或?C#?動(dòng)作(action)的語法描述來構(gòu)造語言識(shí)別器,編譯器和解釋器。?計(jì)算機(jī)語言的解析已經(jīng)變成了一種非常普遍的工作,在這方面的理論和工具經(jīng)過近?40?年的發(fā)展已經(jīng)相當(dāng)成熟,使用?Antlr?等識(shí)別工具來識(shí)別,解析,構(gòu)造編譯器比手工編程更加容易,同時(shí)開發(fā)的程序也更易于維護(hù)。
2.?語言識(shí)別的工具有很多種,比如大名鼎鼎的?Lex?和?YACC,Linux?中有他們的開源版本,分別是?Flex?和?Bison。在?Java?社區(qū)里,除了?Antlr?外,語言識(shí)別工具還有?JavaCC?和?SableCC?等。
算術(shù)表達(dá)式中用到了?4?類記號(hào)?(?在?Antlr?中被稱為?Token),分別是標(biāo)識(shí)符?ID,表示一個(gè)變量;常量?INT,表示一個(gè)常數(shù);換行符?NEWLINE?和空格?WS,空格字符在語言處理時(shí)將被跳過,skip()?是詞法分析器類的一個(gè)方法。如清單?3?所示:
4.6.1.1.1.?清單?3.?記號(hào)定義
?ID?:?('a'..'z'?|'A'..'Z')+?;??INT?:?'0'..'9'?+?;??NEWLINE:'\r'???'\n'?;??WS?:?('?'?|'\t'?|'\n'?|'\r'?)+?{skip();}?;
?
5.?參考
?
開源語法分析器--ANTLR?-?薛笛的專欄?-?博客頻道?-?CSDN.NET.htm
?
詞法分析?-?維基百科,自由的百科全書.htm
(?詳細(xì)?)?詞法分析(字符串分析)?-?Thinker?-?BlogJava.htm
?
瀏覽器探究——webkit部分——解析HTML(3)HTMLToken的處理?-?落魂的專欄?-?博客頻道?-?CSDN.NET.htm
C#?詞法分析器(一)詞法分析介紹?update?2014.1.8?-?CYJB?-?博客園.htm
詞法分析(NFA與DFA)?-?woaidongmao?-?C++博客.htm
Java開源語法分析生成器分類列表.htm
?
(詳細(xì))?使用?Antlr?處理文本_百度文庫.htm
(ibm?詳細(xì))使用?Antlr?開發(fā)領(lǐng)域語言.htm
詞法分析,讓狀態(tài)機(jī)旋轉(zhuǎn)地更猛烈些吧----小話c語言(21)?-?陳曦的分享?-?博客頻道?-?CSDN.NET.htm
詞法分析(Java實(shí)現(xiàn))不用狀態(tài)機(jī)?-?0≡(-∞,+∞)?-?博客頻道?-?CSDN.NET.htm
總結(jié)
以上是生活随笔為你收集整理的atitit.词法分析的实现token attilax总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: change to port 80 in
- 下一篇: U3D-LookAt插值动画