Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 20.12.2020
Сообщений: 1

перенос кода с языка Go на джава

27.06.2021, 03:40. Показов 1115. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,возникла проблема,я не знаю джаву,но мне срочно понадобился перенести программы с языка GO на неё,да я вкурсе что тупень,и да вы здесь не прям всезнающее,но всё равно может кто-то сделает одолжение новичку
package main


import (
"bufio"
"bytes"
"fmt"
"io"
"os"
"unicode"
)


//TokenType тип представляющий константы типа токена
type TokenType int


//Констаты типов токена
const (
EmptyValue TokenType = iota
NUMBER TokenType = iota
IDENT TokenType = iota
OPERATION TokenType = iota
COMPARE TokenType = iota
TERNAR_QUESTION TokenType = iota
TERNAR_COLON TokenType = iota
LBRACKET TokenType = iota
RBRACKET TokenType = iota
COMMA TokenType = iota
SEMICOLON TokenType = iota
FUNCTION_BODY TokenType = iota
)


//Token тип представлющий токен при разборе формулы
type Token struct {
Content string
Type TokenType
}


//Tokenizer хранит данные необходимые для выделения токенов
type Tokenizer struct {
reader *bufio.Reader
currentToken *Token
}


//NewTokenizer инициализирует токенайзер строкой
func NewTokenizer(in io.Reader) *Tokenizer {
return &Tokenizer{
reader: bufio.NewReader(in),
}
}


func (t *Tokenizer) readLexem(stopPred func(rune) bool) string {
buff := bytes.Buffer{}
for {
r, _, err := t.reader.ReadRune()
if err != nil {
break
}
if stopPred(r) {
t.reader.UnreadRune()
break
}


buff.WriteRune(r)
}


return buff.String()
}


func (t *Tokenizer) next() (Token, error) {
//Будет постоянно возвращать EOF, когда текст программы закончился
if _, err := t.reader.Peek(1); err != nil {
return Token{}, io.EOF
}


//Пропускаем пробелы
for {
r, _, err := t.reader.ReadRune()
if err != nil {
return Token{}, io.EOF
}


if !unicode.IsSpace(r) {
t.reader.UnreadRune()
break
}
}


if x, _, _ := t.reader.ReadRune(); unicode.IsDigit(x) {
//Числовые константы
t.reader.UnreadRune()
return Token{
Content: t.readLexem(func(r rune) bool {
return !unicode.IsDigit(r)
}),
Type: NUMBER,
}, nil
} else if unicode.IsLetter(x) {
t.reader.UnreadRune()
return Token{
Content: t.readLexem(func(r rune) bool {
return !(unicode.IsDigit(r) || unicode.IsLetter(r))
}),
Type: IDENT,
}, nil
} else if x == '+' || x == '-' || x == '/' || x == '*' {
return Token{Content: string(x), Type: OPERATION}, nil
} else if x == '=' {
return Token{Content: string(x), Type: COMPARE}, nil
} else if x == '>' {
if op, err := t.reader.Peek(1); err != nil || op[0] != '=' {
return Token{Content: string(x), Type: COMPARE}, nil
}


t.reader.ReadRune()
return Token{Content: ">=", Type: COMPARE}, nil
} else if x == '<' {
op, err := t.reader.Peek(1)
if err != nil ||
(op[0] != '=' && op[0] != '>') {
return Token{Content: string(x), Type: COMPARE}, nil
}


t.reader.ReadRune()
buff := bytes.Buffer{}
buff.WriteRune(x)
buff.WriteByte(op[0])
return Token{Content: buff.String(), Type: COMPARE}, nil
} else if x == '?' {
return Token{Content: string(x), Type: TERNAR_QUESTION}, nil
} else if x == ':' {
if op, err := t.reader.Peek(1); err != nil || op[0] != '=' {
return Token{Content: string(x), Type: TERNAR_COLON}, nil
}


t.reader.ReadRune()
return Token{Content: ":=", Type: FUNCTION_BODY}, nil
} else if x == '(' {
return Token{Content: string(x), Type: LBRACKET}, nil
} else if x == ')' {
return Token{Content: string(x), Type: RBRACKET}, nil
} else if x == ',' {
return Token{Content: string(x), Type: COMMA}, nil
} else if x == ';' {
return Token{Content: string(x), Type: SEMICOLON}, nil
} else {
return Token{}, fmt.Errorf("next(): syntax error: wrong token")
}
}


//Peek возвращает следующий токен, но оставляет его в потоке.
func (t *Tokenizer) Peek() (Token, error) {
if t.currentToken == nil {
token, err := t.next()
if err != nil {
return Token{}, err
}


t.currentToken = &token
}


return *t.currentToken, nil
}


//Read забирает из потока и возвращает токен
func (t *Tokenizer) Read() (Token, error) {
if t.currentToken == nil {
token, err := t.next()
if err != nil {
return Token{}, err
}


return token, nil
} else {
token := t.currentToken
t.currentToken = nil
return *token, nil
}
}


//Function представляет функцию
type Function struct {
Ident string
FormalArgs map[string]bool
Argc int


CallsOtherFunctions map[string]int


TimeIn int
ModuleID int
Low int
}


// Нисходящий рекурсивный парсер. (Грамматика в задании)
func parseProgram(functions map[string]*Function, t *Tokenizer) error {
if err := parseFunction(functions, t); err != nil {
return err
}


if _, err := t.Peek(); err != nil {
return nil
}


return parseProgram(functions, t)
}


func parseFunction(functions map[string]*Function, t *Tokenizer) error {
token, err := t.Read()
if err != nil {
return fmt.Errorf("parseFunction(): syntax error: unexpected EOF")
}


if token.Type == IDENT {
if _, ok := functions[token.Content]; ok {
return fmt.Errorf("parseFunction(): syntax error: duplicate function: %s",
token.Content)
}


function := Function{
Ident: token.Content,
FormalArgs: make(map[string]bool),
CallsOtherFunctions: make(map[string]int, 0)}
token, err := t.Read()
if err != nil {
return fmt.Errorf("parseFunction(): syntax error: unknown error: %v",
err)
}


if token.Type != LBRACKET {
return fmt.Errorf("parseFunction(): syntax error: unexpected token: %s",
token.Content)
}


if err := parseFormalArgsList(&function, t); err != nil {
return err
}


token, err = t.Read()
if err != nil {
return fmt.Errorf("parseFunction(): syntax error: unexpected EOF")
}


if token.Type != RBRACKET {
return fmt.Errorf("parseFunction(): syntax error: unexpected token: %s",
token.Content)
}


function.Argc = len(function.FormalArgs)
functions[function.Ident] = &function


token, err = t.Read()
if err != nil {
return fmt.Errorf("parseFunction(): syntax error: unknown error: %v",
err)
}


if token.Type != FUNCTION_BODY {
return fmt.Errorf("parseFunction(): syntax error: unexpected token: %s",
token.Content)
}


if err := parseExpr(&function, t); err != nil {
return err
}


token, err = t.Read()
if err != nil {
return fmt.Errorf("parseFunction(): syntax error: unknown error: %v",
err)
}


if token.Type != SEMICOLON {
return fmt.Errorf("parseFunction(): syntax error: unexpected token: %s",
token.Content)
}
} else {
return fmt.Errorf("parseFunction(): syntax error: unexpected token: %s",
token.Content)
}


return nil
}


func parseFormalArgsList(function *Function, t *Tokenizer) error {
tok, err := t.Peek()
if err != nil {
return nil
}


if tok.Type != IDENT {
return nil
}


return parseIdentList(function, t)
}


func parseIdentList(function *Function, t *Tokenizer) error {
token, err := t.Read()
if err != nil {
return fmt.Errorf("parseIdentList(): syntax error: unexpected EOF")
}


if token.Type != IDENT {
return fmt.Errorf("parseIdentList(): syntax error: unexpected token: %s",
token.Content)
}


if function.FormalArgs[token.Content] {
return fmt.Errorf("parseIdentList(): syntax error: duplicate arg: %s",
token.Content)
}


function.FormalArgs[token.Content] = true


token, err = t.Peek()
if err != nil {
return nil
}


if token.Type == COMMA {
t.Read()
return parseIdentList(function, t)
}


return nil
}


func parseExpr(function *Function, t *Tokenizer) error {
if err := parseComparisonExpr(function, t); err != nil {
return err
}


token, err := t.Peek()
if err != nil {
return nil
}


if token.Type == TERNAR_QUESTION {
t.Read()
if err := parseComparisonExpr(function, t); err != nil {
return err
}


token, err = t.Read()
if err != nil {
return err
}


if token.Type != TERNAR_COLON {
return fmt.Errorf("parseExpr(): syntax error: unexpected token: %s",
token.Content)
}


return parseExpr(function, t)
}


return nil
}


func parseComparisonExpr(function *Function, t *Tokenizer) error {
if err := parseArithExpt(function, t); err != nil {
return err
}


token, err := t.Peek()
if err != nil {
return nil
}


if token.Type == COMPARE {
t.Read()
return parseArithExpt(function, t)
}


return nil
}


func parseArithExpt(function *Function, t *Tokenizer) error {
if err := parseTerm(function, t); err != nil {
return err
}


token, err := t.Peek()
if err != nil {
return nil
}


if token.Type == OPERATION &&
(token.Content == "+" || token.Content == "-") {
t.Read()
return parseArithExpt(function, t)
}


return nil
}


func parseTerm(function *Function, t *Tokenizer) error {
if err := parseFactor(function, t); err != nil {
return err
}


token, err := t.Peek()
if err != nil {
return nil
}


if token.Type == OPERATION &&
(token.Content == "*" || token.Content == "/") {
t.Read()
return parseTerm(function, t)
}


return nil
}


func parseFactor(function *Function, t *Tokenizer) error {
token, err := t.Read()
if err != nil {
return fmt.Errorf("parseFactor(): syntax error: unexpected EOF")
}


if token.Type == OPERATION && token.Content == "-" {
return parseFactor(function, t)
} else if token.Type == IDENT {
tok, err := t.Peek()
if err != nil {
return nil
}


if tok.Type == LBRACKET { // Вызов функции
t.Read()
argc, err := parseActualArgsList(function, t)
if err != nil {
return err
}


function.CallsOtherFunctions[token.Content] = argc


tok, err := t.Read()
if err != nil {
return fmt.Errorf("parseFactor(): syntax error: unexpected EOF")
}


if tok.Type != RBRACKET {
return fmt.Errorf("parseFactor(): syntax error: unexpected token: %s",
token.Content)
}
} else { // Просто переменная
if !function.FormalArgs[token.Content] {
return fmt.Errorf("parseFactor(): syntax error: can not resolve: %s",
token.Content)
}
}
} else if token.Type == LBRACKET {
if err := parseExpr(function, t); err != nil {
return err
}


token, err := t.Read()
if err != nil {
return fmt.Errorf("parseFactor(): syntax error: unexpected EOF")
}


if token.Type != RBRACKET {
return fmt.Errorf("parseFactor(): syntax error: unexpected token: %s",
token.Content)
}
} else if token.Type == NUMBER {
//Представим, что делаем что-то полезное с NUMBER
} else {
return fmt.Errorf("parseFactor(): syntax error: unexpected token: %s",
token.Content)
}


return nil
}


func parseActualArgsList(function *Function, t *Tokenizer) (int, error) {
tok, err := t.Peek()
if err != nil {
return 0, nil
}


if tok.Type == RBRACKET {
return 0, nil
}


return parseExprList(function, t)
}


func parseExprList(function *Function, t *Tokenizer) (int, error) {
if err := parseExpr(function, t); err != nil {
return 0, err
}


token, err := t.Peek()
if err != nil {
return 0, nil
}


if token.Type == COMMA {
t.Read()
argc, err := parseExprList(function, t)
return argc + 1, err
}


return 1, nil
}


//Алгоритм Тарьяна поиска компонент сильной связности.
func dfs(currentFunction *Function, functions map[string]*Function, stack *[]*Function,
time *int, moduleID *int) error {
currentFunction.TimeIn = *time
currentFunction.Low = *time
*stack = append(*stack, currentFunction)
(*time)++


for call, argc := range currentFunction.CallsOtherFunctions {
callFunction, ok := functions[call]
if !ok {
return fmt.Errorf("dfs(): unknown function %s", call)
}


if callFunction.Argc != argc {
return fmt.Errorf("dfs(): syntax error: %s expected %d args, have %d values",
call, callFunction.Argc, argc)
}


if callFunction.TimeIn == 0 {
if err := dfs(callFunction, functions, stack, time, moduleID); err != nil {
return err
}
}


if callFunction.ModuleID == 0 &&
currentFunction.Low > callFunction.Low {
currentFunction.Low = callFunction.Low
}
}


if currentFunction.TimeIn == currentFunction.Low {
for {
stackLen := len(*stack)
nextFunc := (*stack)[stackLen-1]
*stack = (*stack)[:stackLen-1]
nextFunc.ModuleID = *moduleID


if nextFunc == currentFunction {
break
}
}


(*moduleID)++
}


return nil
}


func findRecursiveDependencies(functions map[string]*Function) (int, error) {
stack := make([]*Function, 0)


time := 1
moduleID := 1
for _, function := range functions {
if function.TimeIn == 0 {
if err := dfs(function, functions, &stack, &time, &moduleID); err != nil {
return 0, err
}
}
}


return moduleID - 1, nil
}


func main() {
tokenizer := NewTokenizer(os.Stdin)
functions := make(map[string]*Function)
if err := parseProgram(functions, tokenizer); err != nil {
fmt.Println("error")
return
}


result, err := findRecursiveDependencies(functions)
if err != nil {
fmt.Println("error")
return
}


fmt.Println(result)
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.06.2021, 03:40
Ответы с готовыми решениями:

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

Компилирование языка Джава
Привет! Подскажите, как можно скомпилировать код ДжаваСкрипт так, чтобы его можно было открыть на любом другом? В пример 1 из кодов: ...

Перенос из одного языка программирования в другой
Помогите,пожалуйста,перевести данную программу из Delphi в СИ++. Задан одномерный массив X размер N.Каждый из элементов X заменить...

1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.06.2021, 10:43
Давай ты зайдешь в поиск и поищешь там разбор выражений. Как минимум 3 рабочих варианта на форуме было.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2021, 10:43
Помогаю со студенческими работами здесь

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

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

Перевод кода с языка С на С++
Привет! Имею проблему.. Написал код на С но сложно перевести на С++ #include &lt;stdio.h&gt; #define M 10 #define N 5 main() { ...

Перевод кода с языка C# на F#
Срочно понадобился перевод этой программы в среду F#, или хотя бы аналог по функциональности, буду очень благодарен. С функциональным...

Перевод кода с языка Pascal на C++
Доброго времени суток всем. Дабы не плодить темы, также отпишусь здесь: необходимо перевести код паскаля на С, С++ ил С#, любой из них. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru