Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
language: kotlin

jdk:
- oraclejdk9

os:
- linux

before_script:
- wget https://services.gradle.org/distributions/gradle-4.5.1-bin.zip
- unzip gradle-4.5.1-bin.zip
- export GRADLE_HOME=$PWD/gradle-4.5.1
- export PATH=$GRADLE_HOME/bin:$PATH

script:
- chmod +x build.sh
- bash build.sh
10 changes: 10 additions & 0 deletions bash/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Архитектура
![Image](https://pp.userapi.com/c845321/v845321454/1962dd/W9ATvrz_K6k.jpg)

На картинке показана упрощённая модель потока данных в архитектуре

Сначала строка из stdin попадает в лексер, где разбивается на токены

Оттуда токены передаются в парсер вместе с окружением, где по пайпам токены делятся на команды: первый токен - имя, остальные - аргументы

Дальше этот массив передаётся контроллеру, который исполняет команды, передавая выходной поток одной команды на вход другой
33 changes: 33 additions & 0 deletions bash/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.2.51'
}

version '1.0-SNAPSHOT'

apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = 'hse.nedikov.bash.Main'

repositories {
mavenCentral()
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Собирающийся jar файл нельзя запустить т.к. не указана точка входа в программу

dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А JUint из воздуха возьмётся?

// https://mvnrepository.com/artifact/junit/junit
testCompile group: 'junit', name: 'junit', version: '4.12'

}

jar {
manifest { attributes 'Main-Class': "${mainClassName}" }
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Binary file added bash/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
5 changes: 5 additions & 0 deletions bash/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
172 changes: 172 additions & 0 deletions bash/gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

84 changes: 84 additions & 0 deletions bash/gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions bash/settings.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
rootProject.name = 'bash'

41 changes: 41 additions & 0 deletions bash/src/main/kotlin/hse/nedikov/bash/Controller.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package hse.nedikov.bash

import hse.nedikov.bash.logic.Command
import java.io.PipedReader
import java.io.PipedWriter


class Controller(val exceptionHandler: (Exception) -> Unit) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще, каждому классу нужны комментарии

private val env = Environment()

fun isWorking() = env.isWorking()

fun runCommandLine(line: String, outputHandler: (String) -> Unit) {
val tokens = Lexer(line, env.variables).lex()
val commands = parse(tokens, env)
val flow = makeFlow(commands);
flow.invoke().forEachLine { outputHandler(it) }
}

fun makeFlow(commands: ArrayList<Command>): () -> PipedReader =
if (commands.isEmpty()) {
{ emptyCommandFlow() }
} else commandFlow(commands[0], commands.apply { removeAt(0) })

private fun commandFlow(command: Command, commands: ArrayList<Command>): () -> PipedReader = {
commands.reversed().fold(command.execute()) { reader, command ->
try {
command.execute(reader)
} catch (e: Exception) {
exceptionHandler(e)
emptyCommandFlow()
}
}
}

private fun emptyCommandFlow(): PipedReader {
val reader = PipedReader()
PipedWriter(reader).close()
return reader
}
}
Loading