2017-02-09 12 views
0

В этом задании много сообщений, большинство из которых хотят знать, как это сделать. Пожалуйста, дайте мне разобраться в этом самостоятельно - я просто ищу одну или две части помощи, а не кому-то, чтобы выполнить свое задание для меня.Ошибка переполнения стека в рекурсивной синтаксисе. Домашняя домашняя работа

Назначение - написать программу, которая реализует правила синтаксиса для построения произвольных предложений.

Когда я реализую свой код, я получаю переполнение стека, но я смоделировал его после кода примера, который не имеет этой ошибки. Я знаю, что это что-то с моим заявлением if...else в sentence();, вызывающим его.

Вот мой код:

import java.util.Random; 
import java.util.ArrayList; 
import java.util.List; 


public class RecursiveSyntax { 

    private static final String[] conjunction = { "and", "or", "but", "because" }; 
    private static final String[] properNoun = { "Fred", "Jane", "Richard Nixon", "Miss America" }; 
    private static final String[] commonNoun = { "man", "woman", "fish", "elephant", "unicorn" }; 
    private static final String[] determiner = { "a", "the", "every", "some" }; 
    private static final String[] adjective = { "big", "tiny", "pretty", "bald" }; 
    private static final String[] intransitiveVerb = { "runs", "jumps", "talks", "sleeps" }; 
    private static final String[] transitiveVerb = { "loves", "hates", "sees", "knows", "looks for", "finds" }; 

     public static void main(String[] args) { 



      List<String[]> arrayList = new ArrayList<>(); 
      arrayList.add(conjunction); 
      arrayList.add(properNoun); 
      arrayList.add(commonNoun); 
      arrayList.add(determiner); 
      arrayList.add(adjective); 
      arrayList.add(intransitiveVerb); 
      arrayList.add(transitiveVerb); 



       while (true) { 
       sentence(); 
       System.out.println(".\n\n"); 
       try { 
        Thread.sleep(3000); 
       } 
       catch (InterruptedException e) { 
       } 
       } 
      } 







    private static void sentence() { 
     int c = (int)(Math.random()*conjunction.length); 
     double x = Math.random(); 
     if (x < 0.2) 
      simpleSentence(); 
     else 
      simpleSentence(); 
      System.out.print(conjunction[c]); 
      sentence(); 


     } 



     private static void simpleSentence() { 
      nounPhrase(); 
      verbPhrase(); 

     } 


     private static void nounPhrase() { 
      int pn = (int)(Math.random()*properNoun.length); 
       System.out.print(" "+ properNoun[pn] + " "); 

     } 

     private static void verbPhrase() { 
      int iv = (int)(Math.random()*intransitiveVerb.length); 
      System.out.print(" " + intransitiveVerb[iv]); 

     } 


    } 

Я просто смотрю на две вещи:

  1. Как исправить мою ошибку переполнения стека
  2. Что я делаю неправильно с моей if..else заявление?

Мне нужно позвонить simpleSentence() части времени, а на случайных взвешенных проценты времени вызова simpleSentence, а затем напечатать случайное соединение из массива конъюнкции, а затем запустить sentence() снова без ошибок переполнения стека.

БНФ для этой части:

<sentence> ::= <simple_sentence> [ <conjunction> <sentence> ] 
<simple_sentence> ::= <noun_phrase> <verb_phrase> 

Копии требований назначения можно найти здесь (если это необходимо для ясности) Par 1 Рекурсивного Синтаксис: http://math.hws.edu/eck/cs225/s10/lab3/.

+1

Ошибка stackoverflow означает, что вы повторяете слишком много раз. – Carcigenicate

+0

Если я правильно понимаю ваш код, 'sentance' будет называть себя 80% времени. – Carcigenicate

+0

Спасибо за ответ. Я знаю об этом, но я не уверен, как ограничить рекурсию. Я полагаю, что это происходит в инструкции if ... else, но я не уверен, почему это происходит здесь, когда в этом примере кода нет, чтобы вести нас через это задание. –

ответ

0

Нет, предложение будет называть себя 100% времени ... это не питон, , и поэтому ваши отступы вводят в заблуждение. Вам нужно сделать еще { simpleSentence(); ... предложение() }. Как написано, только первый оператор после else является его частью. - Foon

Это решило все! Спасибо Foon !!