如何使用Jison将孟加拉数字识别为NUMBER token并输出孟加拉数字结果
用Jison实现孟加拉数字识别与解析的可运行方案
1. 词法分析(Lexer)配置
首先通过Unicode范围匹配孟加拉数字(孟加拉数字对应Unicode编码为U+09E6到U+09EF,对应字符为০-৯),识别为NUMBER类型token,同时预留内部计算用的阿拉伯数字转换逻辑和原始孟加拉数字的存储字段:
%lex %% // 匹配连续的孟加拉数字 [\u09E6-\u09EF]+ { const bnToArMap = {'০':0,'১':1,'২':2,'৩':3,'৪':4,'৫':5,'৬':6,'৭':7,'৮':8,'৯':9}; let arabicNumStr = ''; for (const char of yytext) { arabicNumStr += bnToArMap[char]; } return { type: 'NUMBER', innerValue: parseInt(arabicNumStr), // 内部运算用阿拉伯数字,避免编码兼容问题 rawBnValue: yytext // 保留原始孟加拉数字字符串,无运算需求可直接返回该字段 }; } // 匹配运算符号(按需调整你需要支持的符号) [+*/()-] { return yytext; } // 忽略空白字符 \s+ { /* 无操作 */ } <<EOF>> { return 'EOF'; } /lex
2. 语法解析(Parser)配置
在解析头部提前定义阿拉伯数字转孟加拉数字的工具函数,所有运算逻辑用阿拉伯数字完成后,统一转换为孟加拉数字输出:
%{ // 阿拉伯数字转孟加拉数字映射表 const arToBnMap = {'0':'০','1':'১','2':'২','3':'৩','4':'৪','5':'৫','6':'৬','7':'৭','8':'৮','9':'৯'}; // 转换工具函数,支持整数输出,如有小数需求可自行扩展逻辑 function convertArToBn(num) { return num.toString().split('').map(digit => arToBnMap[digit]).join(''); } %} // 声明token与运算优先级 %token NUMBER %left '+' '-' %left '*' '/' %start root %% // 语法规则示例:支持基础加减乘除运算 root: expr EOF { return $1; } ; expr: expr '+' expr { $$ = convertArToBn($1 + $3); } | expr '-' expr { $$ = convertArToBn($1 - $3); } | expr '*' expr { $$ = convertArToBn($1 * $3); } | expr '/' expr { $$ = convertArToBn(Math.floor($1 / $3)); } | '(' expr ')' { $$ = $2; } | NUMBER { $$ = convertArToBn($1.innerValue); } ; %%
3. 测试调用示例
将上述规则保存为bn-number.jison文件,编译后用以下代码测试:
const parser = require('./bn-number.js'); // 输入孟加拉数字表达式示例:1+2*3 对应的孟加拉数字 const input = '১+২*৩'; const result = parser.parse(input); console.log(result); // 输出结果为 ৭
适配说明
- 如果仅需要识别孟加拉数字不需要做运算,语法规则可简化为仅匹配
NUMBER,直接返回$1.rawBnValue即可 - 需要支持小数的话,修改lex中的数字匹配规则为
[\u09E6-\u09EF]+\.?[\u09E6-\u09EF]*,同时扩展转换函数适配小数位即可
内容的提问来源于stack exchange,提问作者Taslima Akhter
相关产品推荐
相关产品推荐

