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