ANTL4 上的相互左递归词法分析器规则



我正在尝试编写 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: [?!];

最新更新