如何调试 jack 编程语言中的 Expected )、Expected { 和 Expected 语句(do, let, while, return or if) 错误

how to debug the Expected ), Expected { and Expected statement(do, let, while, return or if) errors in jack Programming Language

提问人:user11482997 提问时间:5/30/2023 最后编辑:Sujith Kumaruser11482997 更新时间:6/1/2023 访问量:52

问:

我正在研究杰克的编程语言,并试图制作一个刽子手游戏代码,我已经为游戏编写了没有图形表示的代码。但到目前为止,我找不到任何调试代码的帮助

class HangmanGame {
  field String secretWord;
  field String guessedLetters;
  field int maxAttempts;
  field int attempts;

  constructor HangmanGame new(String word) {
    let secretWord = word;
    let guessedLetters = "";
    let maxAttempts = 6;
    let attempts = 0;
    return this;
  }

  method void play() {
    var String displayWord;
    var char letter;
    var int i;
    let displayWord = "";
    while (i < secretWord.length()) 
    {
      let letter = secretWord.charAt(i);
      if (guessedLetters.contains(String.valueOf(letter))) 
      {
        let displayWord = displayWord + String.valueOf(letter);
      } 
      else 
      {
        let displayWord = displayWord + "_";
      }
    let i = i + 1;
    }
    do Output.printString(displayWord);
    while (displayWord != secretWord && attempts < maxAttempts) {
      do Output.printString("\nEnter a letter: ");
      let char guess = Keyboard.readChar();
      let guessedLetters = guessedLetters + String.valueOf(guess);
      let boolean found = false;
      let int j = 0;
      while (j < secretWord.length()) {
        if (secretWord.charAt(j) == guess) {
          let found = true;
          let displayWord = displayWord.substring(0, j) + String.valueOf(guess) + displayWord.substring(j + 1);
        }
        let j = j + 1;
      }

      if (!found) {
        let attempts = attempts + 1;
        do Output.printString("Incorrect guess. Attempts remaining: " + (maxAttempts - attempts));
      }

      do Output.printString(displayWord);
    }

    do Output.printString("\nCongratulations! You guessed the word.");
  }
}

现在在编译时。我有错误 在 HangmanGame.jack(第 34 行)中:在子程序播放中:预期 ) 在 HangmanGame.jack(第 34 行)中:在子例程播放中:预期 { 在 HangmanGame.jack(第 34 行)中: 在子例程播放中: 预期语句(do, let, while, return or if)

第 34 行是while (displayWord != secretWord && attempts < maxAttempts) {

我做错了什么

我试过加括号,它删除了 ) 和 { 错误,但 Expected 语句(do、let、while、return 或 if)保持不变,这对我来说毫无意义

哎呀 ,jack nand2tetris jack-compiler

评论


答:

1赞 raphael 6/1/2023 #1

有时错误来自意想不到的地方,有时编译器会混淆错误发生的位置。我的猜测是,在这种情况下,错误与括号无关,而是与括号后面的语句有关:

let char guess = Keyboard.readChar();
let guessedLetters = guessedLetters + String.valueOf(guess);
let boolean found = false;
let int j = 0;

关键字用于为变量分配新值,而关键字用于声明变量。与 java 和许多其他语言不同,您可以同时执行这两项操作,但 jack 并非如此。在 jack 中,您必须在函数的开头声明所有变量,然后您可以为它们赋值(包括初始化变量):letvar

溶液

 method void play() {
    var String displayWord;
    var char letter;
    var int i;
    
    // DECLARE variables here, just like you did the ones above, including the type
    var char guess;
    var String guessedLetters;
    var boolean found;
    var int j;

    let displayWord = "";
    while (i < secretWord.length()) 
    {
      let letter = secretWord.charAt(i);
      if (guessedLetters.contains(String.valueOf(letter))) 
      {
        let displayWord = displayWord + String.valueOf(letter);
      } 
      else 
      {
        let displayWord = displayWord + "_";
      }
    let i = i + 1;
    }
    do Output.printString(displayWord);
    while (displayWord != secretWord && attempts < maxAttempts) {
      do Output.printString("\nEnter a letter: ");
      
      // NOTE: notice that here I removed the type, since that goes with the 
      // declaration of the variables
      let guess = Keyboard.readChar();
      let guessedLetters = guessedLetters + String.valueOf(guess);
      let found = false;
      let j = 0;

      while (j < secretWord.length()) {
        if (secretWord.charAt(j) == guess) {
          let found = true;
          let displayWord = displayWord.substring(0, j) + String.valueOf(guess) + displayWord.substring(j + 1);
        }
        let j = j + 1;
      }

      if (!found) {
        let attempts = attempts + 1;
        do Output.printString("Incorrect guess. Attempts remaining: " + (maxAttempts - attempts));
      }

      do Output.printString(displayWord);
    }

    do Output.printString("\nCongratulations! You guessed the word.");
  }

那么为什么 jack 不允许你做一些看似简单的事情,比如在一行中声明和初始化一个变量。简单。这使得编写编译器变得更加困难!