1

我正在尝试在我的编程语言中添加对数组的支持并且遇到了麻烦

Array
  : '[' Expr ("," Expr)* ']'
     {{ $$  = ['ArrayList', $1]; }}
  | '[' Expr ']'
     {{ $$ = ['Array', $2]; }}
  | '[' ']'
     {{ $$ = ['Empty']; }}
  ;

但是,这不会解析“[1,2,3,4]。” Jison 告诉我它需要“]”,但它得到了“,”。有任何想法吗?

4

2 回答 2

3

递归不会被解释或拒绝。您必须将其拆分为 2 个元素才能使其工作:

Array
  : '[' Element ']'
     {{ $$  = ['ArrayList', $2]; }}
  ;

Element
  : Element "," Expr
     {{ $$ = $1 + ',' + $3 }}
  | Expr
     {{ $$ = $1 }};

这将按预期返回一个数组:

["ArrayList","1,2,3,4"]
于 2015-02-14T03:21:38.547 回答
1

jison不接受 EBNF。(显然,它也不拒绝它。)所以你的规则:

Array
  : '[' Expr ("," Expr)* ']'

被解释为:

Array
  : '[' Expr "," Expr ']'

您需要创建一个 ExprList 产生式:

Array   : '[' ExprList ']'
        | '[' ']'
        ;
ExprList: Expr
        | ExprList ',' Expr
        ;
于 2015-02-14T03:06:20.010 回答