Учим английскую грамматику с помощью программного кода или открытый проект code-for-learning-languages

от автора

image

В очередной раз пытаясь повторить английскую грамматику, я поймал себя на мысли, что постоянно забываю элементарные правила из одной строчки, при том что код большой программы запоминаю легко и без особого труда. Скорее всего то же самое у многих программистом, профессиональная деформация и все такое, однако почему бы не воспользоваться таким простым способом запомнить все эти сложные правила английского просто записав их с помощью программного кода?

Поэтому у меня возникла идея создать открытый проект на github’e code-for-learning-languages, в котором любой может добавлять свои мнемонические правила на своих языках программирования для любого естественного языка. По собственному опыту, именно написания собственного "кода" наиболее полезно для запоминания грамматики естественного языка.

Внимание: это экспериментальный проект (даже скорее идея проекта), не уверен, что для любого программиста такой способ запоминания грамматики будет оптимальным (и вообще раздел ненормальное программирование поставлен не просто так 🙂 ). В общем, стандартное open sourc’ное — идея предоставляется бесплатно и как есть, автор не несет никакой гарантии её полезности и не возвращает потраченное на неё время. 🙂

Давайте посмотрим, как это работает (кода будет на Java, так как Си-подобный синтаксис знает почти каждый программист), буду благодарен pull request’ам на других языках.

Запишем правила для всех прошлых времен.

    switch (tenseForms) {         case SIMPLE:             return pronoun + verb + "ed";         case CONTINUOUS:             return pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ing";         case PERFECT:             return pronoun + HAD + verb + "ed";         case PERFECT_CONTINUOUS:             return pronoun + HAD + BEEN + verb + "ing";     }    

Правила для времен

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

Опишем утвердительные предложения для каждого времени (Positive sentence)

Tense Simple Continuous Perfect Perfect Continuous
Past pronoun + verb + "ed" pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ing" pronoun + HAD + verb + "ed" pronoun + HAD + BEEN + verb + "ing"
Present pronoun + verb + (pronoun == HE_SHE_IT ? "s" : "") pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + verb + "ing" pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + verb + "ed" pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + BEEN + verb + "ing"
Future pronoun + WILL + verb pronoun + WILL + BE + verb + "ing" pronoun + WILL + HAVE + verb + "ed" pronoun + WILL + HAVE + BEEN + verb + "ing"
Future In Past pronoun + WOULD + BE + verb + "ing" pronoun + WOULD + BE + verb + "ing" pronoun + WOULD + HAVE + verb + "ed" pronoun + WOULD + HAVE + BEEN + verb + "ing"

Или так:
Прошлое:

        switch (tenseForms) {             case SIMPLE:                 return pronoun + verb + "ed";             case CONTINUOUS:                 return pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ing";             case PERFECT:                 return pronoun + HAD + verb + "ed";             case PERFECT_CONTINUOUS:                 return pronoun + HAD + BEEN + verb + "ing";         }

Настоящее

        switch (tenseForms) {             case SIMPLE:                 return pronoun + verb + (pronoun == HE_SHE_IT ? "s" : "");             case CONTINUOUS:                 return pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + verb + "ing";             case PERFECT:                 return pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + verb + "ed";             case PERFECT_CONTINUOUS:                 return pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + BEEN + verb + "ing";         }

Будущее:

       switch (tenseForms) {             case SIMPLE:                 return pronoun + WILL + verb;             case CONTINUOUS:                 return pronoun +  WILL + BE + verb + "ing";             case PERFECT:                 return pronoun + WILL +  HAVE + verb + "ed";             case PERFECT_CONTINUOUS:                 return pronoun +  WILL +  HAVE + BEEN + verb + "ing";         }

Или можно записать альтернативы

Альтернативная запись

Будущее

    private static String buildPositiveSentence(Pronoun pronoun, String verb, TenseForms tenseForms) {         return pronoun + WILL + getAuxiliary(tenseForms) + verb + getEnding(tenseForms);     }      private static String getEnding(TenseForms tenseForms) {         if(tenseForms == SIMPLE) return "";         else return tenseForms == PERFECT ? "ed": "ing";     }      private static String getAuxiliary(TenseForms tenseForms) {         switch (tenseForms) {             case SIMPLE:                 return "";             case CONTINUOUS:                 return BE;             case PERFECT:                 return HAVE;         }         return HAVE + BEEN;     } 

Прошлое

    private static String buildPositiveSentence(Pronoun pronoun, String verb, TenseForms tenseForms) {         return pronoun + getAuxiliaryVerb(pronoun, tenseForms, true) +                 getBeenOrEmpty(tenseForms) + verb + getEnding(tenseForms, true);     }      private static String getAuxiliaryVerb(Pronoun pronoun, TenseForms tenseForms, boolean isPositive) {         switch (tenseForms) {             case SIMPLE:                 return isPositive ? "" : DID;             case CONTINUOUS:                 return pronoun == I || pronoun == HE_SHE_IT? WAS: WERE;         }         return HAD;     }      private static String getEnding(TenseForms tenseForms, boolean isPositive) {         if(tenseForms == SIMPLE) return isPositive? "ed" : "";         else return tenseForms == PERFECT ? "ed": "ing";     }      private static String getBeenOrEmpty(TenseForms tenseForms) {         return tenseForms == PERFECT_CONTINUOUS ? BEEN: "";     }

Настоящее

    private static String buildPositiveSentence(Pronoun pronoun, String verb, TenseForms tenseForms) {         return pronoun + getAuxiliaryVerb(pronoun, tenseForms) +                 getBeenOrEmpty(tenseForms) + verb + getEnding(pronoun, tenseForms, true);     }    private static String getAuxiliaryVerb(Pronoun pronoun, TenseForms tenseForms) {         switch (tenseForms) {             case SIMPLE:                 return pronoun == HE_SHE_IT ? DOES : DO;             case CONTINUOUS:                 return pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE;         }         return pronoun == HE_SHE_IT ? HAS: HAVE;     }      private static String getEnding(Pronoun pronoun, TenseForms tenseForms, boolean isPositive) {         if(tenseForms == SIMPLE) return isPositive && pronoun == HE_SHE_IT ? "s" : "";         else return tenseForms == PERFECT ? "ed": "ing";     }      private static String getBeenOrEmpty(TenseForms tenseForms) {         return tenseForms == PERFECT_CONTINUOUS ? BEEN: "";     }

Другие варианты см. в github’e

Опишем отрицательные предложения для каждого времени (Negative sentence)

Tense Simple Continuous Perfect Perfect Continuous
Past pronoun + DID +"not " + verb pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + "not " + verb + "ing" pronoun + HAD + "not " + verb + "ed" pronoun + HAD + "not " + BEEN + verb + "ing"
Present pronoun + (pronoun == HE_SHE_IT ? DOES : DO) + "not " + verb pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + "not " + verb + "ing" pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + "not " + verb + "ed" pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + "not " + BEEN + verb + "ing"
Future pronoun + WILL + "not " + verb pronoun + WILL + "not " + BE + verb + "ing" pronoun + WILL + "not " + HAVE + verb + "ed" pronoun + WILL + "not " + HAVE + BEEN + verb + "ing"

Другие варианты см. в github’e

Вопросы (Questions)

Tense Simple Continuous Perfect Perfect Continuous
Past DID + pronoun + verb + "?" (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + pronoun + verb + "ing?" HAD + pronoun + verb + "ed?" HAD + pronoun + BEEN + verb + "ing?"
Present (pronoun == HE_SHE_IT ? DOES : DO) + pronoun + verb + "?" (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + pronoun + verb + "ing?" (pronoun == HE_SHE_IT ? HAS: HAVE) + pronoun + verb + "ed?" (pronoun == HE_SHE_IT ? HAS: HAVE) + pronoun + BEEN + verb + "ing?"
Future WILL + pronoun + verb + "?" WILL + pronoun + BE + verb + "ing?" WILL + pronoun + HAVE + verb + "ed?" WILL + pronoun + HAVE + BEEN + verb + "ing?"

Другие варианты записи, см. в github’e

Пассивный залог (Passive)

Tense Simple Continuous Perfect
Past pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + verb + "ed" pronoun + (pronoun == I || pronoun == HE_SHE_IT? WAS: WERE) + BEING + verb + "ed" pronoun + HAD + BEEN + verb + "ed"
Present pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + verb + "ed" pronoun + (pronoun == I ? AM : pronoun == HE_SHE_IT ? IS : ARE) + BEING + verb + "ed" pronoun + (pronoun == HE_SHE_IT ? HAS: HAVE) + BEEN + verb + "ed"
Future pronoun + WILL + BE + verb + "ed" NULL pronoun + WILL + HAVE + BEEN + verb + "ed"

Другие варианты записи, см. в github’e

Будущее в прошлом

Используется чтобы в речи, описывающей прошлое время, говорить о будущем.

Запишем правило для утвердительных предложений.

        switch (tenseForms) {             case SIMPLE:                 return pronoun + WOULD + verb;             case CONTINUOUS:                 return pronoun + WOULD + BE + verb + "ing";             case PERFECT:                 return pronoun + WOULD +  HAVE + verb + "ed";             case PERFECT_CONTINUOUS:                 return pronoun + WOULD +  HAVE + BEEN + verb + "ing";         }

Другие варианты записи, см. в github’e

Условные предложения

1 тип: реальное условие в настоящем или будущем времени,
глагол в главном предложении — в будущем времени
глагол в придаточном – в настоящем

if(condition == REAL && (tense == PRESENT || tense == FUTURE)) {             verdInMainStatement = convertToFuture(verdInMainStatement);             verdInSecondStatement = convertToPresent(verdInSecondStatement );         }

2 тип: нереальное условие в настоящем или будущем времени,

if(condition == UNREAL && (tense == PRESENT || tense == FUTURE)) {             verdInMainStatement = SHOULD + verdInMainStatement;             verdInSecondStatement = verdInSecondStatement.equals("be")? WERE:                     (verdInSecondStatement + "ed");         }

3 тип: нереальное условие в прошлом времени:

if(condition == UNREAL && tense == PAST) {             verdInMainStatement = SHOULD + (pronoun == HE_SHE_IT ? HAS: HAVE) + verdInMainStatement + "ed";             verdInSecondStatement = HAD + verdInSecondStatement + "ed";         }

Или запишем все условия в одном коде:

        if(condition == REAL) {             if(tense == PRESENT || tense == FUTURE) { // FirstCondition                                 verdInMainStatement = convertToFuture(verdInMainStatement);                 verdInSecondStatement = convertToPresent(verdInSecondStatement);             } else {                 throw new IllegalStateException(); // Condition isn't exist              }         } else if(condition == UNREAL) {             if(tense == PRESENT || tense == FUTURE) { // SecondCondition                                 verdInMainStatement = SHOULD + verdInMainStatement;                 verdInSecondStatement = verdInSecondStatement.equals("be")? WERE:                         (verdInSecondStatement + "ed");             } else { // ThirdCondition                                 verdInMainStatement = SHOULD + (pronoun == HE_SHE_IT ? HAS: HAVE) +                         verdInMainStatement + "ed";                 verdInSecondStatement = HAD + verdInSecondStatement + "ed";             }         } else {             throw new IllegalStateException(); // Condition isn't exist         } 

Другие варианты записи, см. в github’e

Вот и все с кратким описанием проекта (точнее скорее идеи проекта). Удачи в изучении языков (как естественных, так и программных)!

P.S. Если интересно, буду благодарен звездам на github’e для проекта code-for-learning-languages, любым дополнениям к проекту (хоть в комментах, хоть в pull reauests), распространению информации о проекте как на русскоязычных ресурсах, так и на иностранных.
Проект экспериментальный, принимается любая критика. Если будет полезен возможно дополню другими правилами грамматики (например, формирование разных предлогов места/времени и т.п. для разных случаев).

P.P.S. Так же рекомендую посмотреть другие мои open-source проекты:

  1. useful-java-links — хранилище ссылок на open-source Java библиотеки (и на русском ),
  2. helloworlds — попытка собрать простые примеры для разных Java библиотек,
  3. Шпаргалки программиста — разные обучающие статьи по Java от автора,

ссылка на оригинал статьи https://habrahabr.ru/post/276021/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *