mirror of
https://github.com/jorenchik/mdemory.git
synced 2026-03-22 00:26:21 +00:00
Refactoring
This commit is contained in:
@@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -22,6 +21,10 @@ func main() {
|
|||||||
fmt.Printf("%s\n", err.Error())
|
fmt.Printf("%s\n", err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
log.Println("Lexer output:")
|
||||||
|
for _, el := range tokens {
|
||||||
|
fmt.Print(el.ToString())
|
||||||
|
}
|
||||||
|
|
||||||
automata = parserAutomata()
|
automata = parserAutomata()
|
||||||
err = validateGrammar()
|
err = validateGrammar()
|
||||||
@@ -33,29 +36,9 @@ func main() {
|
|||||||
if (err != nil) {
|
if (err != nil) {
|
||||||
log.Fatal(err.Error())
|
log.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
log.Println("Parser output:")
|
||||||
for _, element := range questions {
|
for _, element := range questions {
|
||||||
switch element.(type) {
|
fmt.Printf("%s", element.ToString())
|
||||||
case SingleAnswerQuestion:
|
|
||||||
fmt.Printf(
|
|
||||||
"<Single choice> (%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(
|
|
||||||
"<Multi choice> (%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 "))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println("Compilation completed")
|
log.Println("Compilation completed")
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var tokens []Token
|
var tokens []Token
|
||||||
var buffer []rune
|
var buffer []rune
|
||||||
var row int32 = 1
|
var row int32 = 1
|
||||||
var column int32 = 1
|
var column int32 = 1
|
||||||
var previousRow int32 = -1
|
var previousRow int32 = -1
|
||||||
var previousColumn int32 = -1
|
var previousColumn int32 = -1
|
||||||
var textStarted bool = false
|
var textStarted bool = false
|
||||||
|
|
||||||
type TokenType int
|
type TokenType int
|
||||||
|
|
||||||
@@ -36,6 +37,27 @@ type Token struct {
|
|||||||
column int32;
|
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) {
|
func makePostTextToken(ttype TokenType, tokenLen int32, textType TokenType) {
|
||||||
if (len(strings.Trim(string(buffer), " \n\t")) - 1 > 0) {
|
if (len(strings.Trim(string(buffer), " \n\t")) - 1 > 0) {
|
||||||
textFragment := []rune{}
|
textFragment := []rune{}
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Question interface {}
|
type Question interface {
|
||||||
|
ToString() string;
|
||||||
|
}
|
||||||
|
|
||||||
type SingleAnswerQuestion struct {
|
type SingleAnswerQuestion struct {
|
||||||
id string;
|
id string;
|
||||||
@@ -27,6 +29,32 @@ type MultipleChoiceQuestion struct {
|
|||||||
section string;
|
section string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (question SingleAnswerQuestion)ToString() string {
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"<Single choice> (%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(
|
||||||
|
"<Multi choice> (%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 {
|
type QuestionElement struct {
|
||||||
isDash bool;
|
isDash bool;
|
||||||
content string;
|
content string;
|
||||||
@@ -95,31 +123,7 @@ func parserAutomata() map[TokenType][]TokenType {
|
|||||||
func validateGrammar() error {
|
func validateGrammar() error {
|
||||||
for i := 0; i < len(tokens) - 1; i++ {
|
for i := 0; i < len(tokens) - 1; i++ {
|
||||||
token := tokens[i]
|
token := tokens[i]
|
||||||
content := token.content
|
|
||||||
if (token.tokenType == TextFragment) {
|
|
||||||
content = strings.Replace(
|
|
||||||
strings.Trim(content, " "),
|
|
||||||
"\n",
|
|
||||||
"\\n",
|
|
||||||
-1,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
nextToken := tokens[i + 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<len(automata[token.tokenType]); k++ {
|
|
||||||
ttype := automata[token.tokenType][k]
|
|
||||||
fmt.Printf(" %s,", ToString(&ttype))
|
|
||||||
}
|
|
||||||
fmt.Print("\n:")
|
|
||||||
}
|
|
||||||
if (!contains(automata[token.tokenType], nextToken.tokenType)) {
|
if (!contains(automata[token.tokenType], nextToken.tokenType)) {
|
||||||
return CompilerErr{
|
return CompilerErr{
|
||||||
message: fmt.Sprintf(
|
message: fmt.Sprintf(
|
||||||
@@ -215,4 +219,3 @@ func ParseQuestions(tokens []Token) ([]Question, error) {
|
|||||||
}
|
}
|
||||||
return questions, nil
|
return questions, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user