Selaa lähdekoodia

SVI Добавление кода синтаксического анализатора

SVI 2 vuotta sitten
vanhempi
commit
63b5b28631
3 muutettua tiedostoa jossa 68 lisäystä ja 8 poistoa
  1. 3 0
      internal/compiler/compiler.go
  2. 57 5
      internal/syntax/syntax.go
  3. 8 3
      src/main.obu

+ 3 - 0
internal/compiler/compiler.go

@@ -38,6 +38,9 @@ func NewCompiler() (*Compiler, error) {
 // Run -- запускает компилятор в работу
 func (sf *Compiler) Run() error {
 	log.Printf("Compiler.Run()\n")
+	if err := sf.syntax.Run(); err != nil {
+		return fmt.Errorf("Compiler.Run(): in work main syntax, err=\n\t%w", err)
+	}
 	return nil
 }
 

+ 57 - 5
internal/syntax/syntax.go

@@ -6,21 +6,73 @@ package syntax
 import (
 	"fmt"
 	"log"
+	"unicode"
+)
+
+const ( // Класс литеры
+	alpha   = "alpha" // Буква
+	digit   = "digit" // Цифра
+	space   = "space" // Пробел
+	dot     = "dot"   // Точка
+	newLine = "\n"    // Новая строка
 )
 
 // Syntax -- синтаксический потоковый анализатор
 type Syntax struct {
-	textSrc []rune // Исходный набо рун для анализа
+	runeSrc []rune // Исходный набор рун для анализа
 }
 
 // NewSyntax -- возвращает новый потоовый синтаксический анализатор
-func NewSyntax(textSrc []rune) (*Syntax, error) {
+func NewSyntax(runeSrc []rune) (*Syntax, error) {
 	log.Printf("NewSyntax()\n")
-	if textSrc == nil {
-		return nil, fmt.Errorf("NewSyntax(): text==nil")
+	if runeSrc == nil {
+		return nil, fmt.Errorf("NewSyntax(): runeSrc==nil")
 	}
 	sf := &Syntax{
-		textSrc: textSrc,
+		runeSrc: runeSrc,
 	}
 	return sf, nil
 }
+
+// Run -- обрабатыает входящий поток данных
+func (sf *Syntax) Run() error {
+	log.Printf("Syntax.Run()\n")
+	i := 0
+	for {
+		if len(sf.runeSrc) == 0 {
+			break
+		}
+		_rune := sf.runeSrc[0]
+		// что за тип руны?
+		switch class := sf.classifyRune(_rune); class {
+		case alpha: // какая-то буква, проверить наличие 'модуль'
+			sf.checkModuleBegin()
+		case digit:
+			// fmt.Printf("класс = цифра\n")
+		case space:
+		case dot:
+		case newLine:
+		default:
+			strRune := string(_rune)
+			fmt.Printf("%v\trune = %v\t", i, strRune)
+			fmt.Printf("класс = неизвестный\n")
+		}
+		i++
+	}
+	return fmt.Errorf("Syntax.Run(): доделать")
+}
+
+// Пытается вычислить начало модуля
+func (sf *Syntax)checkModuleBegin()bool{
+	
+}
+// Классифицирует очередную руну из текста
+func (sf *Syntax) classifyRune(rune_ rune) string {
+	if unicode.IsLetter(rune_) {
+		return alpha
+	}
+	if unicode.IsDigit(rune_) {
+		return digit
+	}
+	return ""
+}

+ 8 - 3
src/main.obu

@@ -8,8 +8,13 @@
 модуль Главный;
 
 импорт {
-    СИСТЕМА=``,
-    Лог=`#/log.obu`
+    СИСТЕМА  =``;
+    Лог = `#/log.obu`;
+}
+
+конст {
+    стрМакс = 1000;
+    журналМакс = стрМакс *10;
 }
 
 тип {
@@ -55,7 +60,7 @@
 {
     Лог.СтрокаПеревод(`Привет, мир!`);
     журнал = ?Журнал{
-        год:2005,
+        год:2005;
     }
     журнал.год = 2020;
     ош = журнал.Открыть("Пионер");