我正在尝试编写 Swift 语言亮点。除了一些语言结构的标记之外,我还想强调一下。遇到以下规则的问题:
Type
: '[' Type ']'
| '[' Type ':' Type ']'
| (Attributes? Function_type_argument_clause 'throws'? '->' Type | Attributes? Function_type_argument_clause 'rethrows' '->' Type)
| (Type_name Generic_argument_clause? | Type_name Generic_argument_clause? '.' Type)
| Tuple_type
| Type '?'
| Type '!'
| (Type_name Generic_argument_clause? | Type_name Generic_argument_clause? '.' Type) '&' Protocol_composition_continuation
| (Type '.' 'Type' | Type '.' 'Protocol')
| 'Any'
| 'Self'
| '(' Type ')'
;
错误:以下规则集是相互左递归的 [类型]
试图在规则中离开,只有以下情况:
Type
: Type '?'
| 'Any'
| 'Self'
;
但问题仍然存在:以下规则集是相互左递归的 [类型]
您将Type
定义为词法分析器规则。词法分析器规则不能保留递归。 Type
应该是解析器规则。
请参阅:ANTLR中解析器规则和词法分析器规则之间的实际区别?
请注意,有现有的 Swift 语法:
- https://github.com/antlr/grammars-v4/blob/master/swift2/Swift2.g4
- https://github.com/antlr/grammars-v4/blob/master/swift3/Swift3.g4
请注意,这些语法是用户提交的,请正确测试它们!
编辑
我仍然无法从词汇分析的角度来看理解它
哦,你只是在标记?好吧,那么你不能像现在这样使用Type
。您将不得不重写它,以便不再有左递归。
例如,假设简化的Type
规则如下所示:
Type
: '[' Type ']'
| '[' Type ':' Type ']'
| Type '?'
| Type '!'
| 'Any'
| 'Self'
| '(' Type ')'
;
那么你应该像这样重写它:
Type
: TypeStart TypeTrailing?
;
fragment TypeStart
: '[' Type ']'
| '[' Type ':' Type ']'
| 'Any'
| 'Self'
| '(' Type ')'
;
fragment TypeTrailing: [?!];