如何解析含递减运算符(如c--)的表达式?JS转i486汇编工具遇Tokenizer错误
解决递减运算符(--)的分词与解析问题
看起来你的分词器在处理--时出现了优先级匹配的问题——能正确处理++但--报错,大概率是运算符匹配的顺序或者逻辑有疏漏。我给你梳理下具体的排查和修复步骤:
优先匹配多字符运算符
核心问题很可能是分词器先匹配了单个-(减号),而没有优先识别连续的--作为递减运算符。比如如果你的代码里先判断单个-,c--会被拆成c、-、-三个token,后续语法分析器无法理解这种结构,就会抛出类型赋值错误。
你需要调整匹配顺序,先检查双字符的运算符:// 正确的匹配逻辑示例 function tokenize() { // ...其他分词逻辑 // 先处理双字符运算符 if (currentChar === '+' && peekNextChar() === '+') { tokens.push({ type: 'INCREMENT', value: '++' }); advance(2); // 跳过两个字符 } else if (currentChar === '-' && peekNextChar() === '-') { tokens.push({ type: 'DECREMENT', value: '--' }); advance(2); } // 再处理单字符运算符 else if (currentChar === '+') { tokens.push({ type: 'PLUS', value: '+' }); advance(); } else if (currentChar === '-') { tokens.push({ type: 'MINUS', value: '-' }); advance(); } // ...其他运算符处理 }确保peekNextChar函数的正确性
上面用到的peekNextChar需要能安全获取下一个字符而不移动当前指针,避免越界:function peekNextChar() { const nextPos = currentPos + 1; return nextPos < input.length ? input[nextPos] : null; }验证分词结果
修复后可以加个调试输出,确认c--的分词结果:应该是[{type: 'IDENTIFIER', value: 'c'}, {type: 'DECREMENT', value: '--'}],而不是拆成三个token。只有分词正确了,后续的语法分析和代码生成才能正常工作。语法分析器适配后缀递减
如果你之前只处理了后缀递增(c++),还要确保语法分析器能识别后缀递减的结构。比如在处理标识符后,检查下一个token是否是DECREMENT,如果是,就生成对应的汇编逻辑——后缀递减是先使用变量的值,再将变量减1,对应i486的汇编大概是:; 处理c--的后缀递减逻辑示例 mov eax, [c] ; 先取出c的值到eax push eax ; 保存当前值(用于表达式计算) dec eax ; eax减1 mov [c], eax ; 把减后的值存回c pop eax ; 恢复原来的值作为表达式结果
按照这个思路调整代码,应该就能解决c--的解析错误问题了。
内容的提问来源于stack exchange,提问作者FlatAssembler
相关产品推荐
相关产品推荐

