[GO] #3-10. 패키지 탐방 (text)

Study·2021년 6월 15일
0

고랭

목록 보기
17/18
post-thumbnail

text/scanner

scanner 는 스캐너와 인코딩된 UTF-8 텍스트에 대한 토큰나이저를 제공한다.

소스를 제공하는 io.Reader 가 필요하며 Scan 함수에 대한 반복 호출을 통해 토큰화할 수 있다.

기존 도구와 호환성을 위해서 NUL 문자는 허용되지 않는다.

소스의 첫 번째 문자가 UTF-8 로 인코딩된 BOM(바이트 순서 표시) 이면 삭제된다.

기본적으로 Scanner 는 공백과 GO 주석을 건너뛰고 GO 언어 사양에 정의 된대로 모든 리터럴을 인식한다. 이런 리터럴의 하위 집합만 인식하고 다른 식별자와 공백 문자를 인식하도록 사용자가 직접 지정할 수 있다.

상수

토큰 인식을 제어하기위한 사전 정의된 비트(GO 식별자, 정수 등)만 인식하도록 주석을 건너 뛰도록 Scanner 를 구성하려면 Scanner 의 Mode 필드를 다음과 같이 설정한다.

ScanIdents | ScanInts | SkipComments

SkipComments 가 설정된 경우 건너 뛰는 주석을 제외하고 인식할 수 없는 토큰은 무시되지 않는다. 대신 각 개별 문자를 반환한다.

예로 ScanIdents 모드일 때 foo 는 토큰 시퀀스 Idents 로 스캔된다.

const (
    ScanIdents     = 1 << -Ident
    ScanInts       = 1 << -Int
    ScanFloats     = 1 << -Float // 16진 부동 소수점 및 Ints 포함
    ScanChars      = 1 << -Char
    ScanStrings    = 1 << -String
    ScanRawStrings = 1 << -RawString
    ScanComments   = 1 << -Comment
    SkipComments   = 1 << -skipComment // 주석이 공백으로 됨
    GoTokens       = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments
)

Scan 결과는 이런 토큰 중 하나 또는 유니코드 문자이다.

const (
    EOF = -(iota + 1)
    Ident
    Int
    Float
    Char
    String
    RawString
    Comment
)

GO 공백은 스캐너의 공백 필드에 대한 기본값이다.

이 값은 GO 의 주석 문자를 선택한다.

const GoWhitespace = 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' '

함수

func TokenString(tok rune) string

토큰이나 유니코드 문자에 대한 출력 가능한 문자열을 반환한다.

타입

Position

type Position struct {
    Filename string // 파일이름 (있을 경우)
    Offset   int    // b 부터 시작하는 byte offset
    Line     int    // 1 부터 시작하는 line number
    Column   int    // 1부터 시작하는 column number(해당 문자 수)
}

Position 은 위치 값으로 표시된다.

Line > 0 이면 위치가 유효하다.

func (pos *Position) IsValid() bool

포지션이 유효한지 아닌지 여부를 반환한다.

Scanner

type Scanner struct {

	// 에러는 각각의 발생한 에러에 대해 호출된다.
	// 에러 함수가 설정되지 않으면, 에러는 os.Stderr 가 반환된다.
	Error func(s *Scanner, msg string)

	// 각각의 발생된 함수에 대해 1씩 증가한다.
	ErrorCount int

	// 모드는 인식되는 토큰을 제어한다.
	// 예를 들어 Int 를 인식하면, ScanInts 비트를 설정한다.
	// 필드는 언제든 변경할 될 수 있다.
	Mode uint

	// Whitespane 는 공백처럼 인식된 문자를 제어한다.
	// 공백과 같은 ch <= ' ' 문자를 인식하기 위해, Whitespan 에서 ch'th 비트를 설정한다.
	// (Scanner 의 동작에는 ch > ' ' 값이 정의되어 있지 않다.)
	// 이 필드는 언제든 변경할 수 있다.
	Whitespace uint64

	// IsIdentRune 은 식별자에서 i 번째 룬으로 허용되는 문자를 제어하는 술어이다.
	// 유효한 문자의 집합은 공백 문자의 집합과 교차해서는 안된다.
	// IsIdentRune 함수가 설정되있지 않으면 일반 GO 식별자가 대신 허용된다.
	// 이 필드는 언제든 교체될 수 있다.
	IsIdentRune func(ch rune, i int) bool // Go 1.4

	// 가장 최근에 스캔된 토큰의 시작 위치; 스캔에 의해 설정된다.
	// Init 도는 Next 를 호출하면 위치가 무효화된다. (Line == 0)
	// 파일 이름은 항상 스캐너에 의해 변경되지 않는다.
	// 오류가 반환되고 오류를 통해 위치가 유효하지 않은 경우
	// 스캐너가 토큰 내부에 있지 않는다.
	// Pos 를 호출하여 오류 위치를 얻거나 가장 최근에 스캔한 토큰 직후 위치를 얻는다.
	Position
}

io.Reader 에서의 토큰과 유니코드 문자의 읽기를 구현한다.

func (s *Scanner) Init(src io.Reader) *Scanner

새로운 소스로 Scanner 를 호출하고 s 를 반환한다.

Error 는 nil 로, ErrorCount 는 0 으로, Mode 는 GoTokens 로, Whitespace 는 GoWhitespace 로 설정한다.

func (s *Scanner) Next() rune

다음 유니코드 문자를 읽고 반환한다.

소스 끝에 EOF 를 반환한다.

nil 이 아닌 경우 s.Error 를 호출하여 읽기 오류를 보고한다. 그렇지 않으면 os.Stderr 에 오류 메시지를 인쇄한다.

다음은 스캐너의 위치 필드를 업데이트하지 않는다. Pos() 를 이용하여 최근 위치를 얻는다.

func (s *Scanner) Peek() rune

스캐너 진행 없이 소스의 다음 유니코드 문자를 반환한다.

스캐너의 위치가 소스 마지막 문자에 있으면 EOF를 반환한다.

func (s *Scanner) Pos() (pos Position)

Next 또는 Scan 에 대한 마지막 호출에서 반환된 문자 또는 토큰 바로 뒤의 문자 위치를 반환한다.

가장 최근에 스캔한 토큰의 시작 위치로 스캐너의 위치 필드를 사용한다.

func (s *Scanner) Scan() rune

소스에서 다음 토큰 또는 유니 코드 문자를 읽고 반환한다.

각 모드 비트 (1 << -t) 가 설정된 토큰 t 만 인식 한다.

소스 끝에 EOF 를 반환한다. nil 이 아닌 경우 s.Error 를 호출하여 스캐너 오류를 보고한다. 그렇지 않으면 os.Stderr 에 오류 메시지를 인쇄한다.

func (s *Scanner) TokenText() string

가장 최근에 스캔한 토큰에 해당하는 문자열을 반환한다.

Scan 호출 후 Scanner.Error 호출 시 유효하다.

text/tabwriter

tabwriter 는 입력의 탭 열을 올바르게 정렬된 텍스트로 변환하는 쓰기 필터 (tabwriter.Writer) 를 구현한다.

해당 패키지는 Elastic Tabstops 알고리즘을 사용하고 있다.

상수

이러한 플래그를 사용하여 형식을 제어할 수 있다.

const (
    // html 태그를 무시하고 엔티티 ('&' 로 시작하고 ';' 로 끝나는
    // 단일 문자로 취급한다.
    FilterHTML uint = 1 << iota
    
    // 스트립 이스케이프 문자는 텍스트와 함께 변경하지 않고 
    // 이스케이프된 텍스트 세그먼트를 괄호로 묶는다.
    StripEscape
    
    // 셀 내용물의 오른쪽 정렬을 수행한다.
    // 기본 값은 왼쪽 정렬이다.
    AlignRight
    
    // 빈 열은 처음에 입력이 없는 것처럼 처리한다.
    DiscardEmptyColumns
    
    // 들여쓴 컬럼에 대해 항상 탭을 사용한다.
    TabIndent
    
    // 컬럼 사이에 (|) 을 출력한다.
    Debug
)

텍스트 세그먼트를 이스케이프하려면 이스케이프 문자로 괄호를 사용해야한다.

0xff 값은 유효한 UTF-8 시퀀스에 나타날 수 없기 때문에 선택되었다.

const Escape = '\xff'

타입

Writer

type Writer struct {
     // 필터링되거나 내보내지지 않은 필드 포함
}

Writer 는 입력에서 탭으로 구분된 열 주위에 패딩을 삽입하여 출력에서 정렬하는 필터다.

들어오는 바이트를 가로 \t 또는 세로 \v 탭으로 끝나는 셀과 줄바꿈 \n 또는 폼 피트 \f 로 구성된 UTF-8 인코딩된 텍스트로 처리한다.

연속된 줄의 탭으로 끝나는 셀은 열을 구성한다.

열의 모든 셀이 동일한 너비를 갖도록 필요에 따라 패딩을 삽입하여 열을 효과적으로 정렬한다. 탭 너비를 지정해야하는 탭을 제외하고 모든 문자의 너비가 같다고 가정한다.

열 셀은 탭으로 구분되지 않고 탭으로 끝나야 한다.

행 끝의 탭으로 끝나지 않은 후행 텍스트는 셀을 형성하지만 해당 셀은 정렬된 열의 일부가 아니다.

텍스트 세그먼트는 이스케이스 문자로 괄호로 묶어 이스케이프 할 수 있다.

폼 피드 문자는 개행 문자처럼 작동하지만 현재 행의 모든 열을 종료한다.

한 줄의 적절한 간격은 이후 줄의 셀에 따라 달라질 수 있으니 Writer 는 내부적으로 입력을 버퍼링해야 한다.

func NewWriter(output io.Writer, minwidth, 
	tabwidth, padding int, padchar byte, flags uint) *Writer
    

새 tabwriter.Writer 를 할당하고 초기화한다.

매개 변수는 Init 함수와 동일하다.

func (b *Writer) Flush() error

버퍼링된 모든 데이터가 출력에 디록되도록 하려면 Write 에 대한 마지막 호출 후 Flush 를 호출해야 한다. 끝의 불완전한 이스케이프 시퀀스는 형식화 목적으로 완전한 것으로 간주한다.

func (b *Writer) Init(output io.Writer, minwidth,
	tabwidth, padding int, padchar byte, flags uint) *Writer
    

Writer 는 Init 에 대한 호출로 초기화되어야 한다.

첫 번째 매개변수는 필터 출력을 지정한다.

나머지 매개변수는 형식을 제어한다.

minwidth	최소 셀 너비를 포함한 패딩 탭
tabwidth	탭 문자의 너비
padding		padding added to a cell before computing its width
padchar		패드가 '\t'인 경우 패딩에 사용되는 ASCII 문자, 
		기록자는 형식화된 출력에서 '\t'의 너비가 탭 너비이고 
        	셀은 align_left와 독립적으로 좌회전이라고 가정한다.
flags		서식 제어
func (b *Writer) Write(buf []byte) (int, error)

쓰기는 작성자에게 buf 를 쓴다.

반환되는 유일한 오류는 기본 출력에 쓰는 동안 발생한 오류이다.

text/template

텍스트 출력을 생성하기위한 데이터 기반 템플릿을 구현한다.

HTML 출력을 생성하려면이 패키지와 동일한 인터페이스를 가지고 있지만 특정 공격에 대해 HTML 출력을 자동으로 보호하는 패키지 html / template을 하자.

템플릿은 데이터 구조에 적용하여 실행된다.. 템플릿의 주석은 실행을 제어하고 표시 할 값을 파생하기 위해 데이터 구조의 요소 (일반적으로 구조체의 필드 또는 맵의 키)를 참조한다.

템플릿을 실행하면 구조를 따라 이동하고 마침표 '.'로 표시되는 커서가 설정된다.

템플릿의 입력 텍스트는 모든 형식의 UTF-8 인코딩 텍스트이다.
외부의 모든 텍스트는 변경되지 않고 출력에 복사됩니다.
원시 문자열을 제외하고 작업은 주석이 가능하지만 줄 바꿈에 걸쳐 있지 않을 수 있다.

일단 파싱되면, 병렬 실행이 Writer를 공유하는 경우 출력이 인터리브 될 수 있지만 템플릿은 병렬로 안전하게 실행될 수 있다.

type Inventory struct {
	Material string
	Count    uint
}
sweaters := Inventory{"wool", 17}
tmpl, err := template.New("test")
	.Parse("{{.Count}} items are made of {{.Material}}")
if err != nil { panic(err) }
err = tmpl.Execute(os.Stdout, sweaters)
if err != nil { panic(err) }

위는 17 items are made of wool 를 출력하는 간단한 예이다.

이보다 더 복잡한 예는 다음에서 더 자세히 알아 볼 수 있다.

함수

func HTMLEscape(w io.Writer, b []byte)

일반 텍스트 데이터 b 에 해당하는 이스케이프된 HTML 를 w 에 쓴다.

func HTMLEscapeString(s string) string

일반 텍스트 데이터 s 의 이스케이프된 HTML 를 반환한다.

func HTMLEscaper(args ...interface{}) string

인수의 텍스트 표현에 해당하는 이스케이프된 HTML 을 반환한다.

func IsTrue(val interface{}) (truth, ok bool)

값이 true 인지 아닌지를 반환한다.

func JSEscape(w io.Writer, b []byte)

일반 텍스트 데이터에 해당하는 이스케이프된 JavaScript 를 w 에 기록한다.

func JSEscapeString(s string) string

일반 텍스트 데이터 s 를 이스케이프된 JavaScript 로 반환한다.

func JSEscaper(args ...interface{}) string

인수의 텍스트 표현에 해당하는 이스케이프된 JavaScript 를 반환한다.

func URLQueryEscaper(args ...interface{}) string

URL 쿼리에 포함하기에 적합한 형식으로 인수의 텍스트 표현의 이스케이프된 값을 반환한다.

타입

ExecError

type ExecError struct {
	Name string	// 템플릿 이름
	Err error	// 미리 포맷된 오류
}

템플릿에 오류가 있을 때 반환되는 사용자 지정 오류 유형이다.

func (e ExecError) Error() string

func (e ExecError) Unwrap() error

FuncMap

type FuncMap map[string] interface{}

이름에서 함수로의 매핑을 정의하는 맵 유형이다.

각 함수에는 단일 반환값이 있거나 두 번째 반환 값에 오류가 있는 두 개의 반환 값이 있어야 한다. 이 경우 두 번째 (오류) 반환 값이 실행 중에 nil 이 아닌 것으로 평가되면 실행이 종료되고 Execute 는 해당 오류를 반환한다.

템플릿 실행이 인수 목록에 있는 함수를 호출할 때 해당 목록을 함수의 매개 변수 유형에 할당할 수 있어야 한다.

임의 유형의 인수에 적용되는 함수는 interface{} 유형 또는 reflect.Value 유형의 매개 변수를 사용할 수 있다.

마찬가지로 임의 유형의 결과를 반환하는 함수는 interface{} 또는 reflect.Value 를 반환할 수 있다.

Template

type Template struct {
	*parse.Tree
    // 필터링되거나 내보내지지 않는 필드 포함
}

템플릿은 구문 분석된 템플릿의 표현이다.

*parse.Tree 필드는 html/template 에서만 사용하기 위해 내보내지며 다른 모든 클라이언트에서 내보내지 않은 것으로 처리되어야 한다.

func Must(t *Template, err error) *Template

(*Template, err) 를 반환하는 함수에 대한 호출을 래핑하고 nil 이 아닌 경우 패닉하는 도우미이다.

var t = template.Must(template.New("name").Parse("text"))

위과 같은 변수 초기화에 사용하기 위한 것이다.

func New (name string) *Template

지정된 이름으로 정의되지 않은 새 템플릿을 할당한다.

func ParseFS (fsys fs.Fs, patterns ...string) (*Template, error)

ParseFiles 또는 ParseGlob 과 비슷하지만 호스트 운영 체제의 파일 시스템 대신 파일 시스템 fsys 에서 읽는다.

glob 패턴 목록을 허용한다.

func ParseFiles (filenames ...string) (*Template error)

새 템플릿을 만들고 명명된 파일에서 템플릿 정의를 구문 분석한다.

반환된 템플릿의 이름에는 첫 번째 파일의 기본 이름과 구문 분석된 내용이 있다. 하나 이상의 파일이 있어야 한다.

오류가 발생하면 구문 분석이 중지되고 반환된 *Template 은 nil 이다.

다른 디렉토리에서 동일한 이름을 가진 여러 파일을 구문 분석할 때 마지막으로 언급된 파일이 결과가 된다.

func ParseGlob(pattern string) (*Template, error)

새 템플릿을 만들고 패턴으로 식별된 파일에서 템플릿 정의를 구문 분석한다.

파일은 filepath.Match 의 의미에 따라 일치하며 패턴은 하나 이상의 파일과 일치해야 한다.

반환된 템플릿에는 패턴과 일치하는 첫 번재 파일의 이름과 내용이 있다.

패턴과 일치하는 파일 목록을 사용하여 ParseFiles 를 호출하는 것과 같다.

다른 디렉토리에서 동일한 이름을 가진 여러 파일을 구문 분석할 때 마지막으로 언급된 파일이 결과가 된다.

func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error)

인수 구문 분석 트리를 템플릿 t 와 연결하여 지정된 이름을 제공한다.

템플릿이 정의되지 않은 경우에 트리가 정의된다.

이미 해당 이름이 있는 경우 기존 정의가 대체된다.
그렇지 않으면 새 템플릿이 생성, 정의 및 반환된다.

func (t *Template) Clone() (*Template, error)

연관된 모든 템플릿을 포함하여 템플릿의 복제본을 반환한다.

사본에 템플릿이 추가되지만 원본에는 추가되지 않는다.

클론을 통해 공통 템플릿을 준비하고 클론이 만들어진 후 변형하며 정의하여 사용할 수 있다.

func (t *Template) DefinedTemplates() string

정의된 템플릿을 나열하는 문자열을 반환한다.

이 문자열 앞에 "" 가 붙는다. 정의된 템플릿은 " 이다.

아무것도 없으면 빈 문자열을 반환한다.

func (t *Template) Delims(left, right string) *Template

Parse, ParseFiles 또는 ParseGlob 에 대한 후속 호출에 사용할 작업 구문 기호를 지정된 문자열로 설정한다.

중첩된 템플릿 정의는 설정을 상속할 수 있다.

func (t *Template) Execute(wr io.Writer, data interface{}) error

구문 분석된 템플릿을 지정된 데이터 개체에 적용하고 출력을 wr 에 쓴다.
템플릿을 실행하거나 출력을 쓰는 중에 오류가 발생하면 실행이 중지되지만 일부 결과가 이미 출력 작성기에 기록되었을 수 있다.

병렬 실행이 Writer 를 공유하는 경우 출력이 인터리브 될 수 있지만 템플릿은 병렬로 안전히 실행될 수 있다.

func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error

지정된 데이터 개체에 지정된 이름을 가진 t 와 연결된 템플릿을 적용하고 출력을 wr 에 쓴다.

템플릿을 실행하거나 출력을 쓰는 중에 오류가 발생하면 실행이 중지되지만 일부 결과가 이미 출력 작성기에 기록되었을 수도 있다.

병렬 실행이 Writer 를 공유하는 경우 출력이 인터리브될 수 있지만 템플릿을 안전히 실행될 수 있다.

func (t *Template) Funcs(funcMap FuncMap) *Template

인수 맵의 요소를 템플릿의 함수 맵에 추가한다.

템플릿을 구문 분석하기 전에 호출해야 한다.
맵의 값이 적절한 반환 유형이 있는 함수가 아니거나 이름을 템플릿의 함수로 구문으로 사용할 수 없은 경우 패닉이 발생한다.

Map 의 요소를 덮어 쓰는 것은 합법적이다.

func (t *Template) Lookup(name string) *Template

t 와 연관된 주어진 이름을 가진 템플릿을 반환한다.

그러한 템플릿이 없거나 템플릿에 정의가 없으면 nil 을 반환한다.

func (t *Template) Name() string

템플릿의 이름을 반환한다.

func (t *Template) New(name string) *Template

지정된 것과 동일한 구분 기호를 사용하여 정의되지 않은 새 템플릿을 할당한다. 전이적인 연결을 통해 하나의 템플릿이 다른 템플릿을 호출할 수 있다.

연결된 템플릿은 기본 데이터를 공유하기 때문에 템플릿 구성을 병렬로 안전하게 수행할 수 없다.
템플릿이 구성되면 병렬로 실행할 수 있다.

func (t *Template) Option(opt ...string) *Template

템플릿에 대한 옵션을 설정한다.

단순 문자열 또는 키밸루 문자열로 설명된다.

"missingkey=default" 또는 "missingkey=invalid" 
	기본 동작 : 아무것도하지 않고 실행을 계속한다. 
	인쇄 된 경우 색인 작업의 결과는 문자열 
	"<no value>"입니다.
"missingkey=zero" 
	이 작업은 Map 유형의 요소에 대해 0 값을 반환한다. 
"missingkey=error" 
	오류와 함께 실행이 즉시 중지된다.
func (t *Template) Parse(text string) (*Template, error)

구문 분석 텍스트를 t 에 대한 템플릿 본문으로 구문 분석 한다.

Parse 에 대한 연속 호출에서 템플릿을 재정의할 수 있다.
공백과 주석만 포함된 본문이 있는 템플릿 정의는 비어있는 것으로 간주되며 기존 템플릿의 본문을 대체하지 않는다.

func (t *Template) ParseFS(fsys fs.Fs, patterns ..string) (*Template, error)

ParseFiles 또는 ParseGlob 과 비슷하지만 호스트 운영 체제의 파일 시스템 대신 파일 시스템 fsys 에서 읽는다.

func (t *Template) ParseFiles(filenames ...string) (*Template, error)

명명된 파일을 구문 분석하고 결과 템플릿을 t 와 연결한다.

오류가 발생하면 구문 분석이 중지되고 반환된 템플릿은 nil 이다.
하나 이상의 파일이 있어야한다.

func (t *Template) ParseGlob(pattern string) (*Template, error)

패턴으로 식별된 파일의 템플릿 정의를 구문 분석하고 결과 템플릿을 t 와 연결한다. 파일은 filepath.Match 의 의미에 따라 일치하며 패턴은 하나 이상의 파일과 일치해야 한다.

func (t *Template) Template() []*Template

t 와 관련된 정의된 템플릿 조각을 반환한다.

text/template/parse

함수

func IsEmpty(n Node) bool

트리(노드)에 공백이나 주석을 제외한 모든 것이 비어있는지 여부를 반환한다.

func Parse(name, leftElim, rightDelim string, 
	funcs ...map[string] interface{}) (map[string] *Tree, error)
    

인수 문자열에 설명된 템플릿을 구문 분석하여 만든 템플릿 이름에서 parse.Tree 로의 맵을 반환한다.

최상위 템플릿엔 지정된 이름이 지정된다.

오류가 발생하면 구문 분석이 중지되고 오류와 함께 빈 맵이 반환된다.

타입

ActionNode

type ActionNode struct {
    NodeType
    Pos
    
    Line int // 입력 줄 번호. 더이상 사용되지 않고 호환성을 위해 보관
    Pipe *PipeNode // 작업의 파이프 라인
}

작업 (구분자로 묶인 것)을 보유한다.

제어 조치에는 자체 노드가 있고, 필드 평가 및 괄호로 묶인 파이프 라인과 같은 간단한 것을 나타낸다.

func (a *ActionNode) Copy() Node

복사 용도를 위한 함수이다.

BoolNode

type BoolNode struct {
    NodeType
    Pos
    
    True bool	// 부울 상수의 값
}
func (a *BoolNode) Copy() Node

복사 용도를 위한 함수이다.

BranchNode

type BranchNode struct {
    NodeType
    Pos
    
    Line int	// 입력 줄 번호. 더 이상 사용되지 않고 호환성을 위해 보관
    Pipe *PipeNode // 파이프 라인
    List *ListNode // 값이 비어있지 않은 경우 실행할 작업
    ElseList *ListNode // 값이 빈 경우 실행할 작업
}

if, rangewith 의 일반적인 표현이다.

func (b *BranchNode) Copy() Node

복사 용도를 위한 함수이다.

ChainNode

type ChainNode struct {
    NodeType
    Pos
    
    Node Node
    Field []string // 어휘 순서의 식별자
}

체인노드는 필드 엑세스 체인 (. 로 시작하는 식별자) 뒤에 오는 용여를 보유한다.

func (c *ChainNode) Add(field string)

체인 끝에 이름이 지정된 필드(마침표로 시작해야함)를 추가한다.

func (c *ChainNode) Copy() Node

복사 용도를 위한 함수이다.

CommandNode

type CommandNode struct {
    NodeType
    Pos
    
    Args[] Node // 어휘 순서의 인수 : 식별자, 필드 또는 상수
}

명령(평가 작업 내부의 파이프라인)을 보유한다.

func (c *CommandNode)  Copy() Node

복사 용도의 함수이다.

CommentNode

type CommentNode struct {
    NodeType
    Pos
    
    text string // 주석 텍스트
}

주석을 보유한다.

func (c *CommentNode) Copy() Node

복사 용도의 함수이다.

DotNode

type DotNode struct {
    NodeType
    Pos
}

특수 식별자 . 을 보유한다.

func (d *DotNode) Copy() Node

복사 용도의 함수이다.

FieldNode

type Node struct {
    NodeType
    Pos
    
    Ident []string // 어휘 순서의 식별자이다.
}

필드( . 로 시작하는 식별자 )를 보유한다. 이름은 연결될 수 있다.

func (f *FieldNode) Copy() Node

복사 용도의 함수이다.

IdentifierNode

type IdentifierNode struct {
    NodeType
    Pos
    
    Ident string // 식별자의 이름
}

식별자를 보유한다.

func NewIdentifier(ident string) *IdentifierNode

주어진 식별자 이름으로 새 IdentifierNode 를 반환한다.

func (i *IdentifierNode) Copy() Node

복사 용도의 함수이다.

func (i *IdentifierNode) SetPos(pos Pos) *IdentifierNode

위치를 설정한다.

func (i *IdentifierNode) SetTree(t *Tree) *IdentifierNode

노드의 부모 트리를 설정한다.

SetPosSetTreeNewIdentifier 이 공용 메소드로서 서명을 수정할 수 없고, 편의를 위해 연결되어 있다.

IfNode

type IfNode struct {
    BranchNode
}

IfNode 는 {{if}} 조치 및 해당 명령을 나타낸다.

func (i *IfNode) Copy() Node

복사를 위한 용도의 함수이다.

ListNode

type ListNode struct {
    NodeType
    Pos
    
    Nodes []Node	// 어휘 순서의 요소 노드이다.
}

일련의 노드를 보유한다.

func (l *ListNode) Copy() Node

노드를 복사하기 위한 용도의 함수이다.

func (l *ListNode) CopyList() *ListNode

리스트 노드를 복사하기 위한 함수이다.

Mode

type Mode uint
const (
	ParseComments Mode = 1 << iota // 주석을 구문 분석하고 AST에 추가
)

모드 값은 플래그 집합 (또는 0) 이다. 모드는 파싱 동작을 제어한다.

NilNode

type NilNode struct {
    NodeType
    Pos
}

형식화되지 않은 nil 상수를 나타내는 특수 식별자 nil 을 보유한다.

func (n *NilNode) Copy() Node

복사를 위한 함수이다.

Node

type Node interface {
    Type() NodeType
    String() string
    // Copy 는 Node 및 모든 구성 요소의 전체 복사를 수행한다.
    // 타입 역설을 피하기 위해, 몇몇 xxxNodes 에는 
    // *xxxNode 를 반환하는 CopyxxxNode 메소드가 있다.
    Copy() Node
    
    // 전체 원본 입력 문자열에서 노드 시작의 바이트 위치
    Position() Pos
}

NodeType

type NodeType int
    NodeText    NodeType = iota // 일반 텍스트
    NodeAction                  // 필드 평가와 같은 비제어 작업
    NodeBool                    // 부울 상수
    NodeChain                   // 필드 접근의 시퀀스
    NodeCommand                 // 파이프 라인 요소
    NodeDot                     // 커서, 도트

    NodeField      // 필드 또는 메소드 이름
    NodeIdentifier // 식별자. 항상 함수 이름임.
    NodeIf         // if 작업
    NodeList       // 노드 리스트
    NodeNil        // 타입이 없는 nil 상수
    NodeNumber     // 숫자 상수
    NodePipe       // 명령 파이프 라인
    NodeRange      // range 작업
    NodeString     // string 상수
    NodeTemplate   // 템플릿 호출 작업
    NodeVariable   // 변수 $
    NodeWith       // with 작업
    NodeComment    // 주석
)

구문 분석 트리 노드의 유형을 식별한다.

func (t NodeType) Type() NodeType

Type 은 스스로를 반환하고 Node.js 에 포함하기위한 쉬운 기본 구현을 제공한다.

모든 중요치 않은 노드에 포함된다.

NumberNode

type NumberNode struct {
    NodeType 
    Pos

    IsInt       bool        // 숫자에는 정수 값이 있다.
    IsUint      bool        // 숫자에 부호없는 정수 값이 있다.
    IsFloat     bool        // 숫자에는 부동 소수점 값이 있다.
    IsComplex   bool        // 숫자가 복잡하다.
    Int64       int64       // 부호있는 정수 값이다.
    Uint64      uint64      // 부호없는 정수 값이다.
    Float64     float64     // 부동 소수점 값.
    Complex128  complex128  // 복잡한 값.
    텍스트       string      // 입력의 원래 텍스트 표현 
    // 필터링되거나 내보내지지 않은 필드 포함 
}

부호있거나 없는 정수, 부동 소수점 도는 복소수와 같은 숫자를 보유한다.

값은 값을 나타낼 수 있는 모든 유형 아래에서 구문 분석되고 저장한다.

이것은 GO 의 이상적인 상수의 동작을 소량의 코드로 시뮬레이션한다.

func (n *NumberNode) Copy() Node

PipeNode

type PipeNode struct {
    NodeType 
    Pos

    Line      int              // 입력의 줄.
    IsAssign  bool             // 변수가 선언되지 않고 할당된다.
    Decl []   *VariableNode  // 어휘 순서의 변수
    Cmds []   *CommandNode   // 어휘 순서의 명령이다 
    // 필터링되거나 내보내지지 않은 필드 포함 
}

선택적 선언이 있는 파이프 라인을 보유한다.

func (p *PipeNode) Copy() Node

노드를 복사하기 위한 함수이다.

func (p *PipeNode) CopyPipe() *PipeNode

파이프 노드를 복사하기 위한 함수이다.

Pos

type Pos int

해당하는 템플릿이 구분 분석된 원본 입력 텍스트의 바이트 위치를 나타낸다.

func (p Pos) Position() Pos

RangeNode

type RangeNode struct {
	BranshNode
}

{{range}} 작업 및 해당 명령을 나타낸다.

func (r *RangeNode) Copy() Node

노드를 복사하기 위한 함수이다.

StringNode

type StringNode struct {
    NodeType
    Pos
    
    Quoted string	// 인용 부호가 있는 문자열의 원본 텍스트
    Text   string	// 따옴표 처리 후 문자열
}

문자열 상수를 보유한다. 값은 인용되지 않음 이다.

func (s *StringNode) Copy() Node

노드를 복사하기 위한 함수이다.

TemplateNode

type TemplateNopde struct {
    NodeType
    Pos
    
    Line int	// 입력 줄 번호
    Name string	// 템플릿 이름 (따옴표 없음)
    Pipe *PipeNode // 템플릿의 점으로 평가할 명령
}
func (t *TemplateNode) Copy() Node

노드를 복사하기 위한 함수이다.

TextNode

type TextNode struct {
    NodeType 
    Pos
    
    Text []byte // 텍스트. 줄바꿈에 걸쳐있을 수도 있다.
}

일반 텍스트를 보유한다.

func (t *TextNode) Copy() Node

노드를 복사하기 위한 함수이다.

Tree

type Tree struct {
    Name string	// 트리를 나타내는 템플릿 이름
    ParseName string	// 오류 메시지에 대한 구문 분석 중 
    			// 최상위 템플릿 이름
    Root *ListNode	// 트리의 최상위 루트
    Mode Mode	// 구문 분석 모드
}

구문 분석된 단일 템플릿의 표현이다.

func New(name string, funcs ...map[string]interface{}) *Tree

주어진 이름으로 새 구문 분석 트리를 할당한다.

func (t *Tree) Copy() *Tree

Tree 의 복사본을 반환한다.

모든 구문 분석 상태가 삭제된다.

func (t *Tree) ErrorContext(n Node) (location, context string)

입력 텍스트에서 노드 위치의 텍스트 표현을 반환한다.

수신자는 노드에 내부 트리에 대한 포인터가 없을 때만 사용되며, 이는 이전 코드에서 발생할 수 있다.

func(t *Tree) Parse(text, leftDelim, rightDelim string,
	treeSet map[string]*Tree, funcs ...map[string]interface{})
    		(tree *Tree, err error)
            

템플릿 정의 문자열을 구문 분석하여 실행할 템플릿의 표현을 구성한다.

조치 구분 기호 문자열이 비어 있으면 기본값 ( {{ 또는 }} )이 사용된다.

포함된 템플릿 정의가 treeSet 맵에 추가된다.

VariableNode

type VariableNode struct {
    NodeType
    Pos
    
    Ident []string // 변수 이름과 어휘 순서의 필드
}

가능한 체인 필드 접근과 함께 변수 이름 목록을 보유한다.

달러 기호는 이름의 일부이다.

func (v *VariableNode) Copy() Node

노드를 복사하기 위한 함수이다.

WithNode

type WithNode struct {
	BranchNode
}

{{with}} 작업 및 해당 명령을 나타낸다.

func (w *WithNode) Copy() Node

노드를 복사하기 위한 함수이다.

profile
Study

0개의 댓글