我已經開始學習在ANTLR 4.5中編寫一個詞法分析器。從this page,作爲文檔,我看到以下Lexer命令存在:more,pushMode(x),popMode,type(x),channel(x),mode(x),skip。ANTLR4中的各種Lexer命令的功能。我的解釋是否正確?他們每個人做什麼?
我還沒有能夠清楚地瞭解它們的功能。以下是我的他們每個人的理解不:
跳過
這跳過了已在當前令牌被讀取的所有字符。過去的令牌不變。
所以,如果詞法分析器已經看了一些人物a
,它下一步讀取b
,對應於
SOME_RULE : 'b' -> skip;
那麼就會丟掉兩a
和b
並轉到下一個標記。
更多
我不確定這是幹什麼的。該文件說,已閱讀的文本將不會被丟棄,但什麼標記最終都不會在那裏。假設我有
RULE_1 : 'a' -> more;
RULE_2 : 'b';
如果a
被讀取,然後b
,將產生的令牌對應於RULE_2
與語義值ab
,或RULE_1 RULE_2
,還是其他什麼東西?
類型(X)
如果非要
RULE_1 : 'a' -> type(TOKEN_1);
RULE_2 : 'b';
只會a
被取爲TOKEN_1
語義值,或將對應於未標記的規則的所有字符,從一最後一個標記,被視爲語義值?如果一個b
和一個a
到達,將TOKEN_1
的值是a
或ba
?
模式(x)的
這將模式切換到一個新的mode
。但是,在這裏,是直到切換點保存或丟棄的字符?什麼是令牌?每種模式都有單獨的堆棧嗎?
pushMode(X)
這是如何從mode
有什麼不同?這種情況是否已將已讀字符推送到它將要進入的模式,這在mode
中不會發生?
popMode
什麼彈出?如果我有
RULE_1 : 'a' -> popMode;
RULE_2 : 'b' ;
如果我得到一個b
和a
,將popMode
原因只a
退換,或ba
,或令牌,如果有的話?爲什麼我偶爾會因爲空棧而發生錯誤?
channel(x)
我找不到解釋。什麼是頻道?
任何人都可以請澄清這些命令中的每一個的功能,如果可能的話與例子?
請讓我知道這是否太廣泛。
謝謝。