如何使用PLY yacc实现数组解析,识别多逗号分隔的数组元素语法
实现步骤
1. Lexer 前置配置
首先在你的词法分析器中补充3个必要token的识别规则:
- 左中括号
[对应tokenLBRACKET - 右中括号
]对应tokenRBRACKET - 逗号
,对应tokenCOMMA
2. Parser 语法规则编写
以下为Python环境下PLY(常用的Python版lex/yacc实现)的规则示例,你可以直接适配到你的代码中:
# 匹配空数组:[] def p_array_empty(p): 'array : LBRACKET RBRACKET' p[0] = [] # 匹配单元素数组:[exp] def p_array_single(p): 'array : LBRACKET expression RBRACKET' p[0] = [p[2]] # 递归匹配多元素序列:exp, exp, exp... def p_array_elements(p): 'array_elements : array_elements COMMA expression' p[0] = p[1] + [p[3]] # 多元素序列的起始规则:第一个元素 def p_array_elements_start(p): 'array_elements : expression' p[0] = [p[1]] # 匹配多元素数组:[exp1, exp2, exp3...] def p_array_multi(p): 'array : LBRACKET array_elements RBRACKET' p[0] = p[2]
注意:规则中的
expression需要替换为你自己parser中已经定义好的、对应数组内元素语法的非终结符名称。
可选扩展:支持尾逗号
如果需要兼容[a, b, ]这种带末尾逗号的语法,补充以下规则即可:
def p_array_elements_trailing_comma(p): 'array_elements : array_elements COMMA' p[0] = p[1]
内容的提问来源于stack exchange,提问作者TIPDYT
相关产品推荐
相关产品推荐

