ANTLR中的“片段”是什么意思?
ANTLR中的片段是什么意思?
我见过两条规则:
fragment DIGIT : '0'..'9';
和
DIGIT : '0'..'9';
有什么不同?
一个片段有点类似于内联函数:它使语法更易读,更容易维护。
一个片段永远不会被视为一个标记,它只是为了简化语法。
考虑:
NUMBER: DIGITS | OCTAL_DIGITS | HEX_DIGITS; fragment DIGITS: '1'..'9' '0'..'9'*; fragment OCTAL_DIGITS: '0' '0'..'7'+; fragment HEX_DIGITS: '0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+;
在这个例子中,匹配一个NUMBER将总是返回一个数字给词法分析器,不pipe它是否匹配“1234”,“0xab12”或“0777”。
见第3项
根据权威Antlr4参考书:
以fragment为前缀的规则只能从其他词法规则中调用; 它们本身并不是代币。
实际上他们会提高你的语法的可读性。
看看这个例子:
STRING : '"' (ESC | ~["\\])* '"' ; fragment ESC : '\\' (["\\/bfnrt] | UNICODE) ; fragment UNICODE : 'u' HEX HEX HEX HEX ; fragment HEX : [0-9a-fA-F] ;
STRING是一个使用ESC这样的分段规则的词法分析器.Unicode用于Esc规则,Hex用于Unicode分段规则。 ESC和UNICODE和HEX规则不能明确使用。
这个博客文章有一个非常明确的例子,其中fragment
有很大的不同:
grammar number; number: INT; DIGIT : '0'..'9'; INT : DIGIT+;
语法将识别“42”而不是“7”。 您可以通过将数字作为一个片段(或INT后移动DIGIT)来修复它。