syntax.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // package syntax -- синтаксический потоковый анализатор
  2. //
  3. // Читает по одно литере и пытается определеить символ
  4. package syntax
  5. import (
  6. "fmt"
  7. "log"
  8. "unicode"
  9. )
  10. const ( // Класс литеры
  11. alpha = "alpha" // Буква
  12. digit = "digit" // Цифра
  13. space = "space" // Пробел
  14. dot = "dot" // Точка
  15. newLine = "\n" // Новая строка
  16. )
  17. // Syntax -- синтаксический потоковый анализатор
  18. type Syntax struct {
  19. runeSrc []rune // Исходный набор рун для анализа
  20. }
  21. // NewSyntax -- возвращает новый потоовый синтаксический анализатор
  22. func NewSyntax(runeSrc []rune) (*Syntax, error) {
  23. log.Printf("NewSyntax()\n")
  24. if runeSrc == nil {
  25. return nil, fmt.Errorf("NewSyntax(): runeSrc==nil")
  26. }
  27. sf := &Syntax{
  28. runeSrc: runeSrc,
  29. }
  30. return sf, nil
  31. }
  32. // Run -- обрабатыает входящий поток данных
  33. func (sf *Syntax) Run() error {
  34. log.Printf("Syntax.Run()\n")
  35. i := 0
  36. for {
  37. if len(sf.runeSrc) == 0 {
  38. break
  39. }
  40. _rune := sf.runeSrc[0]
  41. // что за тип руны?
  42. switch class := sf.classifyRune(_rune); class {
  43. case alpha: // какая-то буква, проверить наличие 'модуль'
  44. sf.checkModuleBegin()
  45. case digit:
  46. // fmt.Printf("класс = цифра\n")
  47. case space:
  48. case dot:
  49. case newLine:
  50. default:
  51. strRune := string(_rune)
  52. fmt.Printf("%v\trune = %v\t", i, strRune)
  53. fmt.Printf("класс = неизвестный\n")
  54. }
  55. i++
  56. }
  57. return fmt.Errorf("Syntax.Run(): доделать")
  58. }
  59. // Пытается вычислить начало модуля
  60. func (sf *Syntax)checkModuleBegin()bool{
  61. }
  62. // Классифицирует очередную руну из текста
  63. func (sf *Syntax) classifyRune(rune_ rune) string {
  64. if unicode.IsLetter(rune_) {
  65. return alpha
  66. }
  67. if unicode.IsDigit(rune_) {
  68. return digit
  69. }
  70. return ""
  71. }