nand2tetris Jack语言编译错误修复求助:Expected (或)
编译错误修复方案
核心错误点及修复步骤
1. 方法定义笔误
enemyShooting方法开头的mmethod是拼写错误,改为method即可,这是引发后续多个Expected (错误的根源。
2. 条件表达式中的赋值/比较混淆
代码中if ((r = 0))是错误写法:Jack语言不允许在条件中使用赋值操作,且相等比较直接用=,无需额外嵌套括号,应修改为:
if (r = 0) {
3. 误用位运算符号(Jack无原生位运算)
Jack仅支持布尔逻辑运算:&(逻辑与)、|(逻辑或)、~(逻辑非),没有原生位运算功能。你代码中用&/~做位运算,编译器会将其解析为逻辑运算符,导致语法错误(期望布尔表达式,却得到整数运算)。
修复思路分两种:
- 转为布尔判断:假设
getStatus()返回0(未激活)或1(激活),原位运算逻辑alien1.getStatus() & (~alien1.bullet.getStatus())可改为:
若返回非布尔整数,需显式转为布尔判断:alien1.getStatus() & ~alien1.bullet.getStatus()(alien1.getStatus() = 1) & (alien1.bullet.getStatus() = 0) - 自定义位运算函数:如果确实需要位运算,自己实现辅助函数(如
bitAnd、bitNot),再替换代码中的位运算符号。
4. random函数中的位运算替代
return ((t & 255) % (max - min + 1)) + min;中的& 255是位运算,Jack不支持,可替换为等价的整数取模:t % 256(因为255是2^8-1,取模256等价于保留低8位),修改后:
return ((t % 256) % (max - min + 1)) + min;
修复后的完整代码示例
method void enemyShooting() { var int r; let r = Game.random(0, 50); if (r = 0) { if (alien1.getStatus() & ~alien1.bullet.getStatus()) { do alien1.shoot(); } if (alien2.getStatus() & ~alien2.bullet.getStatus()) { do alien2.shoot(); } if (alien3.getStatus() & ~alien3.bullet.getStatus()) { do alien3.shoot(); } if (alien4.getStatus() & ~alien4.bullet.getStatus()) { do alien4.shoot(); } if (alien5.getStatus() & ~alien5.bullet.getStatus()) { do alien5.shoot(); } if (alien6.getStatus() & ~alien6.bullet.getStatus()) { do alien6.shoot(); } } return; } method void checkBullet(Alien alien) { var Bullet b; let b = alien.bullet; do b.update(); if (b.getStatus() & (b.getX() > ship.getX() - 2) & (b.getX() < ship.getX() + 10) & (b.getY() > ship.getY()) & (b.getY() < ship.getY() + 8)) { let lives = lives - 1; do b.setStatus(); } return; } function int random(int min, int max) { var int t; let t = Sys.time(); return ((t % 256) % (max - min + 1)) + min; }
内容的提问来源于stack exchange,提问作者D00MA
相关产品推荐
相关产品推荐

