如何在PEG.js语法中实现十进制、十六进制、二进制多行输出
扩展PEG.js算术语法实现多格式输出与多行输入支持
以下是修改后的PEG.js语法,直接适配你的需求——支持多行输入,每个算术表达式的结果输出十进制、十六进制、8位二进制三种格式:
Start = expressions:Expression+ { return expressions.map(expr => { const dec = expr.toString(); const hex = expr.toString(16); const bin = expr.toString(2).padStart(8, '0'); return `${dec}\n${hex}\n${bin}`; }).join('\n'); } Expression = Addition Addition = left:Multiplication (("+" / "-") right:Multiplication { left += right; })* { return left; } Multiplication = left:Primary (("*" / "/") right:Primary { left *= right; })* { return left; } Primary = Number / ParenthesizedExpression ParenthesizedExpression = "(" expr:Expression ")" { return expr; } Number = digits:[0-9]+ { return parseInt(digits.join(''), 10); }
关键修改说明
- 顶层规则
Start:匹配一个或多个表达式,处理多行输入。将每个表达式的结果转换为三种格式后,用换行拼接所有结果。 - 结果格式化逻辑:
- 十进制:直接将计算结果转为字符串
- 十六进制:使用
toString(16)获取小写十六进制值(若需大写可改用toString(16).toUpperCase()) - 二进制:用
toString(2)获取二进制字符串,再通过padStart(8, '0')补前导零至8位
- 核心算术逻辑:保留原PEG.js算术语法的加减乘除、括号优先级规则,确保计算准确性
使用示例
输入:
(3*(5+8)) 15-7输出:
39 27 00100111 8 8 00001000
内容的提问来源于stack exchange,提问作者HabibS
相关产品推荐
相关产品推荐

