古詩詞大全網 - 成語故事 - 什麽是lexer,什麽是parser,lexer和parser之間的關系

什麽是lexer,什麽是parser,lexer和parser之間的關系

1.參考:

Lexical analysis

了解到。

輸入:壹堆字符,即我們寫的語法代碼,壹個文件,也就是壹堆字符;

經過lexer處理;

輸出:壹系列的token,相當於壹堆的變量或者說符號;

lexer也被叫做:

lexical analyzer

scanner

2.後來參考:

資料下載ANTLR的最全的官方文檔:The Definitive ANTLR Reference:v2,v3,v4版本都有下載

去找到了antlr v3的文檔。

看其解釋,更加深入了解到了壹些內容:

(1)lexer和parser的語法是相同的,但是內部含義不同。

即,最好是自己真正搞懂內部,底層所涉及的含義如何。

即,寫了個語法,要知道真正的含義。

(2)Lexer的rule,是以大寫字母開頭的。

比如:

1

ID : ('a'..'z' |'A'..'Z' |'_' ) ('a'..'z' |'A'..'Z' |'_' |'0'..'9' )* ;

所以,自己去antlrworks中,把之前的某個,小寫字母開頭的規則,從小寫:

改為大寫後,antlrworks中,果然就識別出不同效果,從parser變成lexer了:

3. 為了區別rule所生成的方法,antlr會給生成的id前加m。

比如,上面的ID所生成的方法叫做mID()

4.parser有起始符號,start symbol(類似於入口函數);

lexer沒有start symbol。

5.lexer的語法,其實,就是壹堆的符號定義(token definition)

每個token,都是,針對於輸入的內容,全局性的,任何時刻都試用,都去匹配的。

內部機制:

antlr生成壹個nextToken()的方法,其中就是個大的switch結構,將輸入的內容,匹配到對應的類型的token後,即路由到某個lexer的rule,就去調用對應的rule去處理。

6.不論對於lexer還是parser,其中的大的rule,都最好拆分為小的rule。

目的:使得程序可讀性增加,重用性增加。

7.antlr默認所有的token都是有效(valid)的。

如果妳打算某個規則,只是起到幫助作用,即helper rule,那麽就應該加上對應的fragment前綴。