From 3723a90363dc0349747a1984760a8fe1ecfbe84c Mon Sep 17 00:00:00 2001 From: jorenchik Date: Sun, 4 Aug 2024 15:30:03 +0300 Subject: [PATCH] Refactoring --- src/compiler/compiler.go | 29 +++++---------------- src/compiler/lexer.go | 34 ++++++++++++++++++++----- src/compiler/parser.go | 55 +++++++++++++++++++++------------------- 3 files changed, 63 insertions(+), 55 deletions(-) diff --git a/src/compiler/compiler.go b/src/compiler/compiler.go index d7e52bc..a3dd4da 100644 --- a/src/compiler/compiler.go +++ b/src/compiler/compiler.go @@ -4,7 +4,6 @@ import ( "fmt" "log" "os" - "strings" ) func main() { @@ -22,6 +21,10 @@ func main() { fmt.Printf("%s\n", err.Error()) return } + log.Println("Lexer output:") + for _, el := range tokens { + fmt.Print(el.ToString()) + } automata = parserAutomata() err = validateGrammar() @@ -33,29 +36,9 @@ func main() { if (err != nil) { log.Fatal(err.Error()) } + log.Println("Parser output:") for _, element := range questions { - switch element.(type) { - case SingleAnswerQuestion: - fmt.Printf( - " (%s) %s: %s\n", - element.(SingleAnswerQuestion).section, - strings.Trim(element.(SingleAnswerQuestion).question, "\t\n "), - strings.Trim(element.(SingleAnswerQuestion).answer, "\t\n "), - ) - case MultipleChoiceQuestion: - fmt.Printf( - " (%s) %s\n", - element.(MultipleChoiceQuestion).section, - element.(MultipleChoiceQuestion).question, - ) - for _, el := range element.(MultipleChoiceQuestion).choices { - opener := '-' - if (el.isCorrect) { - opener = '+' - } - fmt.Printf("\t%c %s\n", opener, strings.Trim(el.answer, "\t\n ")) - } - } + fmt.Printf("%s", element.ToString()) } log.Println("Compilation completed") diff --git a/src/compiler/lexer.go b/src/compiler/lexer.go index 0987dd8..f2d4079 100644 --- a/src/compiler/lexer.go +++ b/src/compiler/lexer.go @@ -1,16 +1,17 @@ -package main +package main import ( + "fmt" "strings" ) var tokens []Token var buffer []rune -var row int32 = 1 -var column int32 = 1 -var previousRow int32 = -1 -var previousColumn int32 = -1 -var textStarted bool = false +var row int32 = 1 +var column int32 = 1 +var previousRow int32 = -1 +var previousColumn int32 = -1 +var textStarted bool = false type TokenType int @@ -36,6 +37,27 @@ type Token struct { column int32; } + +func (token Token)ToString() string { + content := token.content + if (token.tokenType == TextFragment) { + content = strings.Replace( + strings.Trim(content, " "), + "\n", + "\\n", + -1, + ) + } + return fmt.Sprintf( + "%s: \"%s\" %d:%d\n", + ToString(&token.tokenType), + content, + token.row, + token.column, + ) +} + + func makePostTextToken(ttype TokenType, tokenLen int32, textType TokenType) { if (len(strings.Trim(string(buffer), " \n\t")) - 1 > 0) { textFragment := []rune{} diff --git a/src/compiler/parser.go b/src/compiler/parser.go index 77f4c46..3c986bc 100644 --- a/src/compiler/parser.go +++ b/src/compiler/parser.go @@ -6,7 +6,9 @@ import ( "log" ) -type Question interface {} +type Question interface { + ToString() string; +} type SingleAnswerQuestion struct { id string; @@ -27,6 +29,32 @@ type MultipleChoiceQuestion struct { section string; } +func (question SingleAnswerQuestion)ToString() string { + return fmt.Sprintf( + " (%s) %s: %s\n", + question.section, + strings.Trim(question.question, "\t\n "), + strings.Trim(question.answer, "\t\n "), + ) +} + +func (question MultipleChoiceQuestion)ToString() string { + acc := "" + acc += fmt.Sprintf( + " (%s) %s\n", + question.section, + question.question, + ) + for _, el := range question.choices { + opener := '-' + if (el.isCorrect) { + opener = '+' + } + acc += fmt.Sprintf("\t%c %s\n", opener, strings.Trim(el.answer, "\t\n ")) + } + return acc +} + type QuestionElement struct { isDash bool; content string; @@ -95,31 +123,7 @@ func parserAutomata() map[TokenType][]TokenType { func validateGrammar() error { for i := 0; i < len(tokens) - 1; i++ { token := tokens[i] - content := token.content - if (token.tokenType == TextFragment) { - content = strings.Replace( - strings.Trim(content, " "), - "\n", - "\\n", - -1, - ) - } nextToken := tokens[i + 1] - fmt.Printf( - "%s: \"%s\" %d:%d\n", - ToString(&token.tokenType), - content, - token.row, - token.column, - ) - if (false) { - fmt.Print("Possible next tokens:") - for k:=0; k