我正在尝试在我的编程语言中添加对数组的支持并且遇到了麻烦
Array
: '[' Expr ("," Expr)* ']'
{{ $$ = ['ArrayList', $1]; }}
| '[' Expr ']'
{{ $$ = ['Array', $2]; }}
| '[' ']'
{{ $$ = ['Empty']; }}
;
但是,这不会解析“[1,2,3,4]。” Jison 告诉我它需要“]”,但它得到了“,”。有任何想法吗?
我正在尝试在我的编程语言中添加对数组的支持并且遇到了麻烦
Array
: '[' Expr ("," Expr)* ']'
{{ $$ = ['ArrayList', $1]; }}
| '[' Expr ']'
{{ $$ = ['Array', $2]; }}
| '[' ']'
{{ $$ = ['Empty']; }}
;
但是,这不会解析“[1,2,3,4]。” Jison 告诉我它需要“]”,但它得到了“,”。有任何想法吗?
递归不会被解释或拒绝。您必须将其拆分为 2 个元素才能使其工作:
Array
: '[' Element ']'
{{ $$ = ['ArrayList', $2]; }}
;
Element
: Element "," Expr
{{ $$ = $1 + ',' + $3 }}
| Expr
{{ $$ = $1 }};
这将按预期返回一个数组:
["ArrayList","1,2,3,4"]
jison
不接受 EBNF。(显然,它也不拒绝它。)所以你的规则:
Array
: '[' Expr ("," Expr)* ']'
被解释为:
Array
: '[' Expr "," Expr ']'
您需要创建一个 ExprList 产生式:
Array : '[' ExprList ']'
| '[' ']'
;
ExprList: Expr
| ExprList ',' Expr
;