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

时间:2018-03-08 11:30:47

标签: antlr antlr4 lexer

我试图编写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' 
   ; 

但问题仍然存在:以下几套规则是相互左递归的[类型]

1 个答案:

答案 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: [?!];