Bison平衡括号语法问题:多层嵌套括号标识符列表解析失败
嵌套括号解构的语法解析修复方案
当前解析器支持以下两种解构语法:
let (x, y, z) = (10, true, 5);let (x) = (10);
但无法处理带有多层嵌套括号的解构场景,例如:
let (((x)), y, z) = (10, true, 5);
原grammar.y代码如下:
identifierlist: identifier COMMA identifierlist { $$ = new PairIdentifierList($1, $3); } | identifier { $$ = new LastIdentifierList($1); } | LPAREN identifier RPAREN { $$ = new LastIdentifierList($2); } | LPAREN identifierlist RPAREN { $$ = $2; } ; identifier: IDENTIFIER { $$ = new Identifier($1); };
问题分析
原规则将括号包裹逻辑放在identifierlist中处理,这种设计无法递归适配多层嵌套括号与其他标识符的组合场景。比如(((x)), y)的结构里,(((x))虽能被解析为identifierlist,但规则层级关系会导致解析器无法正确衔接后续的逗号与标识符。
修复方案
将括号嵌套的处理逻辑移到identifier规则中,让单个标识符支持任意层括号包裹,identifierlist仅负责处理标识符的逗号分隔组合:
identifierlist: identifier COMMA identifierlist { $$ = new PairIdentifierList($1, $3); } | identifier { $$ = new LastIdentifierList($1); } ; identifier: IDENTIFIER { $$ = new Identifier($1); } | LPAREN identifier RPAREN { $$ = $2; } ;
修复原理
- 修改后的
identifier规则允许递归匹配多层括号包裹的标识符,例如(((x)))会被逐层解析为identifier,最终返回最内层的Identifier(x)。 identifierlist只需专注处理逗号分隔的标识符序列,不管每个标识符是否带有嵌套括号,都能正确匹配identifier COMMA identifierlist的结构,从而支持(((x)), y, z)这类语法。
内容的提问来源于stack exchange,提问作者Melih Demirel
相关产品推荐
相关产品推荐

