antlr v4 使用指南連載4——詞法規則入門之黃金定律


詞法規則入門#

黃金定律一二

  1. 若輸入串能被多個詞法規則匹配,那么聲明在詞法文件最前面的規則生效。

parser

parser grammar HelloParser;
options {
	language=Java;
	tokenVocab=HelloLexer;
}

start : HI ID;

lexer例1

lexer grammar HelloLexer; 	//Definea grammar called Hello
ID : [a-zA-Z]+;
HI : 'H' 'I';
WS : [\t\r\n ]+->skip;	//skip spaces,tabs,newlines,\r(Windows)

lexer例2

lexer grammar HelloLexer; 	//Definea grammar called Hello
HI : 'H' 'I';
ID : [a-zA-Z]+;
WS : [\t\r\n ]+->skip;	//skip spaces,tabs,newlines,\r(Windows)

當輸入串為HI antlr時,對於語法規則start,只有使用例2的詞法文件時,才能匹配成功。原因在於,這兩個例子中,HI可以被詞法規則HI、ID匹配。對於例1,輸入串HI,被詞法ID優先匹配,antlr也被ID詞法匹配,所以無法匹配語法規則start : HI ID;。對於例2,輸入串HI,被詞法HI優先匹配,antlr被ID詞法匹配。

  1. 輸入串將被最長匹配的詞法規則匹配。下面用一個稍微復雜一點的例子來說明,本來可以不用例子,一句話也能說明白。比如ABCD肯定會被能完全匹配ABCD的詞法規則匹配,而不是將ABCD拆開分別被匹配,例如被兩個詞法ABC、D匹配。

parser

parser grammar HelloParser;
options {
	language=Java;
	tokenVocab=HelloLexer;
}
numeric_literal : INTEGER | NUMERIC;

lexer

//lexer
lexer grammar HelloLexer; 	//Definea grammar called Hello
ZERO : '0';
DOT : '.';
UNDERLINE : '_';
HI : 'H' 'I';

fragment
    DIGIT : [0-9];

INTEGER : ZERO|[1-9] DIGIT*;
NUMERIC : INTEGER DOT DIGIT+;
ALPHABET : [a-zA-Z];
ID : (ALPHABET|UNDERLINE) (DIGIT|ALPHABET|UNDERLINE)+;
WS : [\t\r\n ]+->skip;	//skip spaces,tabs,newlines,\r(Windows)

對於輸入串12.03,只會被NUMERIC詞法匹配,而不會被拆成12.03分別被INTEGER、DOT、INTEGER、INTEGER匹配。這就是最長匹配原則,也叫貪婪匹配。

未完待續>>>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM