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前綴。