我读了"确定的ANTLR4参考"它说
第71页虽然ANTLR v4可以处理直接左递归,但它无法处理间接左移 递归。
但是在第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'
;
这是对的吗?
答案 0 :(得分:1)
您提到的JSON语法不是问题,因为它实际上不包含任何间接左递归。
规则value
可以生成array
,array
可以再次生成包含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
;