我试图编写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'
;
但问题仍然存在:以下几套规则是相互左递归的[类型]
答案 0 :(得分:1)
您将Type
定义为词法分析器规则。 Lexer规则不能保持递归。 Type
应该是解析器规则。
请参阅:Practical difference between parser rules and lexer rules in ANTLR?
请注意,现有Swift语法:
请注意,这些语法是用户编写的,请正确测试它们!
从词汇分析的角度来看,我仍然无法理解它
哦,你只是象征性的?好吧,那么你现在就不能使用Type
了。您将不得不重写它,以便不再有左递归。
例如,我们说简化的Type
规则如下所示:
Type
: '[' Type ']'
| '[' Type ':' Type ']'
| Type '?'
| Type '!'
| 'Any'
| 'Self'
| '(' Type ')'
;
然后你应该像这样重写它:
Type
: TypeStart TypeTrailing?
;
fragment TypeStart
: '[' Type ']'
| '[' Type ':' Type ']'
| 'Any'
| 'Self'
| '(' Type ')'
;
fragment TypeTrailing: [?!];