詞法規則入門#
黃金定律一二
- 若輸入串能被多個詞法規則匹配,那么聲明在詞法文件最前面的規則生效。
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詞法匹配。
- 輸入串將被最長匹配的詞法規則匹配。下面用一個稍微復雜一點的例子來說明,本來可以不用例子,一句話也能說明白。比如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、.、0、3分別被INTEGER、DOT、INTEGER、INTEGER匹配。這就是最長匹配原則,也叫貪婪匹配。
未完待續>>>