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)来修复它。