antlr4 json语法和间接左递归

时间:2016-01-26 02:12:43

标签: antlr4

我读了"确定的ANTLR4参考"它说

  

虽然ANTLR v4可以处理直接左递归,但它无法处理间接左移   递归。

第71页

但是在第90页的json语法中我会看到下一个

grammar JSON;

json:   object
    |   array
    ;

object
    :   '{' pair (',' pair)* '}'
    |   '{' '}' // empty object
    ;
pair:   STRING ':' value ;

array
    :   '[' value (',' value)* ']'
    |   '[' ']' // empty array
    ;

value
    :   STRING
    |   NUMBER
    |   object  // indirect recursion
    |   array   // indirec recursion
    |   'true'
    |   'false'
    |   'null'
    ;

这是对的吗?

1 个答案:

答案 0 :(得分:1)

您提到的JSON语法不是问题,因为它实际上不包含任何间接左递归。

规则value可以生成arrayarray可以再次生成包含value的内容,但不会生成最左边的内容。 (前面有[value

value规则只会在某种方式产生任何终端和非终端的value时出现问题。

从书中

  

左递归规则就是这样   直接或间接地在备选方案的左边缘调用自己。

示例:

expr : expr '*' expr // match subexpressions joined with '*' 
     | expr '+' expr // match subexpressions joined with '+' operator
     | INT // matches simple integer atom
     ;

它是递归的,因为至少有一个替代方案立即以expr开头。它也是直接左递归。

间接左递归的示例:

expr : addition // indirectly invokes expr left recursively via addition
     | ...
     ;

addition : expr '+' expr 
         ;