|
|
@@ -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 ""
|
|
|
+}
|