//go:generate vartan compile tree.vartan -o tree.json //go:generate vartan-go tree.json --package test package test import ( "bufio" "bytes" "encoding/json" "errors" "fmt" "io" "regexp" "strconv" "strings" "unicode/utf8" ) type TreeDiff struct { ExpectedPath string ActualPath string Message string } func newTreeDiff(expected, actual *Tree, message string) *TreeDiff { return &TreeDiff{ ExpectedPath: expected.path(), ActualPath: actual.path(), Message: message, } } type Tree struct { Parent *Tree Offset int Kind string Children []*Tree Lexeme string } func NewNonTerminalTree(kind string, children ...*Tree) *Tree { return &Tree{ Kind: kind, Children: children, } } func NewTerminalNode(kind string, lexeme string) *Tree { return &Tree{ Kind: kind, Lexeme: lexeme, } } func (t *Tree) Fill() *Tree { for i, c := range t.Children { c.Parent = t c.Offset = i c.Fill() } return t } func (t *Tree) path() string { if t.Parent == nil { return t.Kind } return fmt.Sprintf("%v.[%v]%v", t.Parent.path(), t.Offset, t.Kind) } func (t *Tree) Format() []byte { var b bytes.Buffer t.format(&b, 0) return b.Bytes() } func (t *Tree) format(buf *bytes.Buffer, depth int) { for i := 0; i < depth; i++ { buf.WriteString(" ") } buf.WriteString("(") buf.WriteString(t.Kind) if len(t.Children) > 0 { buf.WriteString("\n") for i, c := range t.Children { c.format(buf, depth+1) if i < len(t.Children)-1 { buf.WriteString("\n") } } } buf.WriteString(")") } func DiffTree(expected, actual *Tree) []*TreeDiff { if expected == nil && actual == nil { return nil } if actual.Kind != expected.Kind { msg := fmt.Sprintf("unexpected kind: expected '%v' but got '%v'", expected.Kind, actual.Kind) return []*TreeDiff{ newTreeDiff(expected, actual, msg), } } if expected.Lexeme != actual.Lexeme { msg := fmt.Sprintf("unexpected lexeme: expected '%v' but got '%v'", expected.Lexeme, actual.Lexeme) return []*TreeDiff{ newTreeDiff(expected, actual, msg), } } if len(actual.Children) != len(expected.Children) { msg := fmt.Sprintf("unexpected node count: expected %v but got %v", len(expected.Children), len(actual.Children)) return []*TreeDiff{ newTreeDiff(expected, actual, msg), } } var diffs []*TreeDiff for i, exp := range expected.Children { if ds := DiffTree(exp, actual.Children[i]); len(ds) > 0 { diffs = append(diffs, ds...) } } return diffs } type TestCase struct { Description string Source []byte Output *Tree } func ParseTestCase(r io.Reader) (*TestCase, error) { parts, err := splitIntoParts(r) if err != nil { return nil, err } if len(parts) != 3 { return nil, fmt.Errorf("too many or too few part delimiters: a test case consists of just tree parts: %v parts found", len(parts)) } tp := &treeParser{ lineOffset: parts[0].lineCount + parts[1].lineCount + 2, } tree, err := tp.parseTree(bytes.NewReader(parts[2].buf)) if err != nil { return nil, err } return &TestCase{ Description: string(parts[0].buf), Source: parts[1].buf, Output: tree, }, nil } type testCasePart struct { buf []byte lineCount int } func splitIntoParts(r io.Reader) ([]*testCasePart, error) { var bufs []*testCasePart s := bufio.NewScanner(r) for { buf, lineCount, err := readPart(s) if err != nil { return nil, err } if buf == nil { break } bufs = append(bufs, &testCasePart{ buf: buf, lineCount: lineCount, }) } if err := s.Err(); err != nil { return nil, err } return bufs, nil } var reDelim = regexp.MustCompile(`^\s*---+\s*$`) func readPart(s *bufio.Scanner) ([]byte, int, error) { if !s.Scan() { return nil, 0, s.Err() } buf := &bytes.Buffer{} line := s.Bytes() if reDelim.Match(line) { // Return an empty slice because (*bytes.Buffer).Bytes() returns nil if we have never written data. return []byte{}, 0, nil } _, err := buf.Write(line) if err != nil { return nil, 0, err } lineCount := 1 for s.Scan() { line := s.Bytes() if reDelim.Match(line) { return buf.Bytes(), lineCount, nil } _, err := buf.Write([]byte("\n")) if err != nil { return nil, 0, err } _, err = buf.Write(line) if err != nil { return nil, 0, err } lineCount++ } if err := s.Err(); err != nil { return nil, 0, err } return buf.Bytes(), lineCount, nil } type treeParser struct { lineOffset int } func (tp *treeParser) parseTree(src io.Reader) (*Tree, error) { toks, err := NewTokenStream(src) if err != nil { return nil, err } gram := NewGrammar() tb := NewDefaultSyntaxTreeBuilder() p, err := NewParser(toks, gram, SemanticAction(NewASTActionSet(gram, tb))) if err != nil { return nil, err } err = p.Parse() if err != nil { return nil, err } synErrs := p.SyntaxErrors() if len(synErrs) > 0 { var b strings.Builder b.Write(formatSyntaxError(synErrs[0], gram, tp.lineOffset)) for _, synErr := range synErrs[1:] { b.WriteRune('\n') b.Write(formatSyntaxError(synErr, gram, tp.lineOffset)) } return nil, errors.New(b.String()) } t, err := tp.genTree(tb.Tree()) if err != nil { return nil, err } return t.Fill(), nil } func formatSyntaxError(synErr *SyntaxError, gram Grammar, lineOffset int) []byte { var b bytes.Buffer b.WriteString(fmt.Sprintf("%v:%v: %v: ", lineOffset+synErr.Row+1, synErr.Col+1, synErr.Message)) tok := synErr.Token switch { case tok.EOF(): b.WriteString("") case tok.Invalid(): b.WriteString(fmt.Sprintf("'%v' ()", string(tok.Lexeme()))) default: if term := gram.Terminal(tok.TerminalID()); term != "" { b.WriteString(fmt.Sprintf("'%v' (%v)", string(tok.Lexeme()), term)) } else { b.WriteString(fmt.Sprintf("'%v'", string(tok.Lexeme()))) } } b.WriteString(fmt.Sprintf(": expected: %v", synErr.ExpectedTerminals[0])) for _, t := range synErr.ExpectedTerminals[1:] { b.WriteString(fmt.Sprintf(", %v", t)) } return b.Bytes() } func (tp *treeParser) genTree(node *Node) (*Tree, error) { // A node labeled 'error' cannot have children. It always must be (error). if sym := node.Children[0]; sym.Text == "error" { if len(node.Children) > 1 { return nil, fmt.Errorf("%v:%v: error node cannot take children", tp.lineOffset+sym.Row+1, sym.Col+1) } return NewTerminalNode(sym.Text, ""), nil } if len(node.Children) == 2 && node.Children[1].KindName == "string" { var text string str := node.Children[1].Children[0] switch str.KindName { case "raw_string": text = str.Children[0].Text case "interpreted_string": var b strings.Builder for _, c := range str.Children { switch c.KindName { case "escaped_seq": b.WriteString(strings.TrimPrefix(`\`, c.Text)) case "escape_char": return nil, fmt.Errorf("%v:%v: incomplete escape sequence", tp.lineOffset+c.Row+1, c.Col+1) case "codepoint_expr": cp := c.Children[0] n, err := strconv.ParseInt(cp.Text, 16, 64) if err != nil { return nil, fmt.Errorf("%v:%v: %v", tp.lineOffset+cp.Row+1, cp.Col+1, err) } if !utf8.ValidRune(rune(n)) { return nil, fmt.Errorf("%v:%v: invalid code point: %v", tp.lineOffset+cp.Row+1, cp.Col+1, cp.Text) } b.WriteRune(rune(n)) default: b.WriteString(c.Text) } } text = b.String() } return NewTerminalNode(node.Children[0].Text, text), nil } var children []*Tree if len(node.Children) > 1 { children = make([]*Tree, len(node.Children)-1) for i, c := range node.Children[1:] { var err error children[i], err = tp.genTree(c) if err != nil { return nil, err } } } return NewNonTerminalTree(node.Children[0].Text, children...), nil } // Code generated by vartan-go. DO NOT EDIT. type ModeID int func (id ModeID) Int() int { return int(id) } type StateID int func (id StateID) Int() int { return int(id) } type KindID int func (id KindID) Int() int { return int(id) } type ModeKindID int func (id ModeKindID) Int() int { return int(id) } type LexSpec interface { InitialMode() ModeID Pop(mode ModeID, modeKind ModeKindID) bool Push(mode ModeID, modeKind ModeKindID) (ModeID, bool) ModeName(mode ModeID) string InitialState(mode ModeID) StateID NextState(mode ModeID, state StateID, v int) (StateID, bool) Accept(mode ModeID, state StateID) (ModeKindID, bool) KindIDAndName(mode ModeID, modeKind ModeKindID) (KindID, string) } // Token representes a token. type Token struct { // ModeID is an ID of a lex mode. ModeID ModeID // KindID is an ID of a kind. This is unique among all modes. KindID KindID // ModeKindID is an ID of a lexical kind. This is unique only within a mode. // Note that you need to use KindID field if you want to identify a kind across all modes. ModeKindID ModeKindID // Row is a row number where a lexeme appears. Row int // Col is a column number where a lexeme appears. // Note that Col is counted in code points, not bytes. Col int // Lexeme is a byte sequence matched a pattern of a lexical specification. Lexeme []byte // When this field is true, it means the token is the EOF token. EOF bool // When this field is true, it means the token is an error token. Invalid bool } type LexerOption func(l *Lexer) error // DisableModeTransition disables the active mode transition. Thus, even if the lexical specification has the push and pop // operations, the lexer doesn't perform these operations. When the lexical specification has multiple modes, and this option is // enabled, you need to call the Lexer.Push and Lexer.Pop methods to perform the mode transition. You can use the Lexer.Mode method // to know the current lex mode. func DisableModeTransition() LexerOption { return func(l *Lexer) error { l.passiveModeTran = true return nil } } type Lexer struct { spec LexSpec src []byte srcPtr int row int col int prevRow int prevCol int tokBuf []*Token modeStack []ModeID passiveModeTran bool } // NewLexer returns a new lexer. func NewLexer(spec LexSpec, src io.Reader, opts ...LexerOption) (*Lexer, error) { b, err := io.ReadAll(src) if err != nil { return nil, err } l := &Lexer{ spec: spec, src: b, srcPtr: 0, row: 0, col: 0, modeStack: []ModeID{ spec.InitialMode(), }, passiveModeTran: false, } for _, opt := range opts { err := opt(l) if err != nil { return nil, err } } return l, nil } // Next returns a next token. func (l *Lexer) Next() (*Token, error) { if len(l.tokBuf) > 0 { tok := l.tokBuf[0] l.tokBuf = l.tokBuf[1:] return tok, nil } tok, err := l.nextAndTransition() if err != nil { return nil, err } if !tok.Invalid { return tok, nil } errTok := tok for { tok, err = l.nextAndTransition() if err != nil { return nil, err } if !tok.Invalid { break } errTok.Lexeme = append(errTok.Lexeme, tok.Lexeme...) } l.tokBuf = append(l.tokBuf, tok) return errTok, nil } func (l *Lexer) nextAndTransition() (*Token, error) { tok, err := l.next() if err != nil { return nil, err } if tok.EOF || tok.Invalid { return tok, nil } if l.passiveModeTran { return tok, nil } mode := l.Mode() if l.spec.Pop(mode, tok.ModeKindID) { err := l.PopMode() if err != nil { return nil, err } } if mode, ok := l.spec.Push(mode, tok.ModeKindID); ok { l.PushMode(mode) } // The checking length of the mode stack must be at after pop and push operations because those operations can be performed // at the same time. When the mode stack has just one element and popped it, the mode stack will be temporarily emptied. // However, since a push operation may be performed immediately after it, the lexer allows the stack to be temporarily empty. if len(l.modeStack) == 0 { return nil, fmt.Errorf("a mode stack must have at least one element") } return tok, nil } func (l *Lexer) next() (*Token, error) { mode := l.Mode() state := l.spec.InitialState(mode) buf := []byte{} unfixedBufLen := 0 row := l.row col := l.col var tok *Token for { v, eof := l.read() if eof { if tok != nil { l.unread(unfixedBufLen) return tok, nil } // When `buf` has unaccepted data and reads the EOF, the lexer treats the buffered data as an invalid token. if len(buf) > 0 { return &Token{ ModeID: mode, ModeKindID: 0, Lexeme: buf, Row: row, Col: col, Invalid: true, }, nil } return &Token{ ModeID: mode, ModeKindID: 0, Row: 0, Col: 0, EOF: true, }, nil } buf = append(buf, v) unfixedBufLen++ nextState, ok := l.spec.NextState(mode, state, int(v)) if !ok { if tok != nil { l.unread(unfixedBufLen) return tok, nil } return &Token{ ModeID: mode, ModeKindID: 0, Lexeme: buf, Row: row, Col: col, Invalid: true, }, nil } state = nextState if modeKindID, ok := l.spec.Accept(mode, state); ok { kindID, _ := l.spec.KindIDAndName(mode, modeKindID) tok = &Token{ ModeID: mode, KindID: kindID, ModeKindID: modeKindID, Lexeme: buf, Row: row, Col: col, } unfixedBufLen = 0 } } } // Mode returns the current lex mode. func (l *Lexer) Mode() ModeID { return l.modeStack[len(l.modeStack)-1] } // PushMode adds a lex mode onto the mode stack. func (l *Lexer) PushMode(mode ModeID) { l.modeStack = append(l.modeStack, mode) } // PopMode removes a lex mode from the top of the mode stack. func (l *Lexer) PopMode() error { sLen := len(l.modeStack) if sLen == 0 { return fmt.Errorf("cannot pop a lex mode from a lex mode stack any more") } l.modeStack = l.modeStack[:sLen-1] return nil } func (l *Lexer) read() (byte, bool) { if l.srcPtr >= len(l.src) { return 0, true } b := l.src[l.srcPtr] l.srcPtr++ l.prevRow = l.row l.prevCol = l.col // Count the token positions. // The driver treats LF as the end of lines and counts columns in code points, not bytes. // To count in code points, we refer to the First Byte column in the Table 3-6. // // Reference: // - [Table 3-6] https://www.unicode.org/versions/Unicode13.0.0/ch03.pdf > Table 3-6. UTF-8 Bit Distribution if b < 128 { // 0x0A is LF. if b == 0x0A { l.row++ l.col = 0 } else { l.col++ } } else if b>>5 == 6 || b>>4 == 14 || b>>3 == 30 { l.col++ } return b, false } // We must not call this function consecutively to record the token position correctly. func (l *Lexer) unread(n int) { l.srcPtr -= n l.row = l.prevRow l.col = l.prevCol } const ( ModeIDNil ModeID = 0 ModeIDDefault ModeID = 1 ModeIDRawString ModeID = 2 ModeIDInterpretedString ModeID = 3 ) const ( ModeNameNil = "" ModeNameDefault = "default" ModeNameRawString = "raw_string" ModeNameInterpretedString = "interpreted_string" ) // ModeIDToName converts a mode ID to a name. func ModeIDToName(id ModeID) string { switch id { case ModeIDNil: return ModeNameNil case ModeIDDefault: return ModeNameDefault case ModeIDRawString: return ModeNameRawString case ModeIDInterpretedString: return ModeNameInterpretedString } return "" } const ( KindIDNil KindID = 0 KindIDWs KindID = 1 KindIDLParen KindID = 2 KindIDRParen KindID = 3 KindIDIdentifier KindID = 4 KindIDRawStringOpen KindID = 5 KindIDInterpretedStringOpen KindID = 6 KindIDRawStringBody KindID = 7 KindIDRawStringClose KindID = 8 KindIDInterpretedSeq KindID = 9 KindIDCodepointPrefix KindID = 10 KindIDLBrace KindID = 11 KindIDRBrace KindID = 12 KindIDHexDigits KindID = 13 KindIDEscapedSeq KindID = 14 KindIDEscapeChar KindID = 15 KindIDInterpretedStringClose KindID = 16 ) const ( KindNameNil = "" KindNameWs = "ws" KindNameLParen = "l_paren" KindNameRParen = "r_paren" KindNameIdentifier = "identifier" KindNameRawStringOpen = "raw_string_open" KindNameInterpretedStringOpen = "interpreted_string_open" KindNameRawStringBody = "raw_string_body" KindNameRawStringClose = "raw_string_close" KindNameInterpretedSeq = "interpreted_seq" KindNameCodepointPrefix = "codepoint_prefix" KindNameLBrace = "l_brace" KindNameRBrace = "r_brace" KindNameHexDigits = "hex_digits" KindNameEscapedSeq = "escaped_seq" KindNameEscapeChar = "escape_char" KindNameInterpretedStringClose = "interpreted_string_close" ) // KindIDToName converts a kind ID to a name. func KindIDToName(id KindID) string { switch id { case KindIDNil: return KindNameNil case KindIDWs: return KindNameWs case KindIDLParen: return KindNameLParen case KindIDRParen: return KindNameRParen case KindIDIdentifier: return KindNameIdentifier case KindIDRawStringOpen: return KindNameRawStringOpen case KindIDInterpretedStringOpen: return KindNameInterpretedStringOpen case KindIDRawStringBody: return KindNameRawStringBody case KindIDRawStringClose: return KindNameRawStringClose case KindIDInterpretedSeq: return KindNameInterpretedSeq case KindIDCodepointPrefix: return KindNameCodepointPrefix case KindIDLBrace: return KindNameLBrace case KindIDRBrace: return KindNameRBrace case KindIDHexDigits: return KindNameHexDigits case KindIDEscapedSeq: return KindNameEscapedSeq case KindIDEscapeChar: return KindNameEscapeChar case KindIDInterpretedStringClose: return KindNameInterpretedStringClose } return "" } type lexSpec struct { pop [][]bool push [][]ModeID modeNames []string initialStates []StateID acceptances [][]ModeKindID kindIDs [][]KindID kindNames []string initialModeID ModeID modeIDNil ModeID modeKindIDNil ModeKindID stateIDNil StateID rowNums [][]int rowDisplacements [][]int bounds [][]int entries [][]StateID originalColCounts []int } func NewLexSpec() *lexSpec { return &lexSpec{ pop: [][]bool{ nil, { false, false, false, false, false, false, false, }, { false, false, true, }, { false, false, false, false, false, false, false, false, true, }, }, push: [][]ModeID{ nil, { 0, 0, 0, 0, 0, 2, 3, }, { 0, 0, 0, }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, modeNames: []string{ ModeNameNil, ModeNameDefault, ModeNameRawString, ModeNameInterpretedString, }, initialStates: []StateID{ 0, 1, 1, 1, }, acceptances: [][]ModeKindID{ nil, { 0, 0, 1, 4, 2, 3, 5, 6, }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 2, 3, 4, 6, 8, }, }, kindIDs: [][]KindID{ nil, { KindIDNil, KindIDWs, KindIDLParen, KindIDRParen, KindIDIdentifier, KindIDRawStringOpen, KindIDInterpretedStringOpen, }, { KindIDNil, KindIDRawStringBody, KindIDRawStringClose, }, { KindIDNil, KindIDInterpretedSeq, KindIDCodepointPrefix, KindIDLBrace, KindIDRBrace, KindIDHexDigits, KindIDEscapedSeq, KindIDEscapeChar, KindIDInterpretedStringClose, }, }, kindNames: []string{ KindNameNil, KindNameWs, KindNameLParen, KindNameRParen, KindNameIdentifier, KindNameRawStringOpen, KindNameInterpretedStringOpen, KindNameRawStringBody, KindNameRawStringClose, KindNameInterpretedSeq, KindNameCodepointPrefix, KindNameLBrace, KindNameRBrace, KindNameHexDigits, KindNameEscapedSeq, KindNameEscapeChar, KindNameInterpretedStringClose, }, initialModeID: ModeIDDefault, modeIDNil: ModeIDNil, modeKindIDNil: 0, stateIDNil: 0, rowNums: [][]int{ nil, { 0, 1, 2, 3, 0, 0, 0, 0, }, { 0, 1, 2, 3, 2, 4, 2, 5, 2, 6, 2, 7, 8, 2, 9, 10, 2, 11, 12, 2, 13, 2, 14, 2, 15, 2, 16, 2, 17, 2, 18, 19, 2, 20, 21, 2, 22, 23, 2, 0, }, { 0, 1, 2, 3, 2, 4, 2, 5, 2, 6, 2, 7, 8, 2, 9, 10, 2, 11, 12, 2, 13, 2, 14, 2, 15, 2, 16, 2, 17, 2, 18, 19, 2, 20, 21, 2, 22, 23, 2, 24, 25, 0, 0, 0, 0, 0, }, }, rowDisplacements: [][]int{ nil, { 0, 0, 189, 75, }, { 0, 0, 246, 1194, 362, 1258, 426, 1114, 490, 554, 618, 1355, 682, 245, 1259, 746, 1323, 810, 1162, 874, 938, 1002, 1371, 1066, }, { 0, 0, 246, 1194, 362, 1258, 426, 1114, 490, 554, 618, 1436, 682, 245, 1259, 746, 1323, 810, 1162, 874, 938, 1002, 1452, 1066, 1504, 1435, }, }, bounds: [][]int{ nil, { -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -1, -1, -1, -1, -1, -1, -1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -1, -1, -1, -1, 3, -1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 13, 13, 13, 13, 13, 13, 13, -1, -1, -1, -1, -1, -1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -1, 13, 13, 13, 13, -1, -1, -1, -1, -1, -1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -1, 13, -1, 13, 13, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -1, -1, -1, -1, -1, -1, -1, 25, 25, 25, 25, 25, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 25, 25, 25, 25, 25, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, }, entries: [][]StateID{ nil, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 7, 0, 0, 0, 0, 6, 4, 5, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 39, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 9, 9, 11, 14, 14, 14, 17, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 26, 28, 28, 30, 33, 33, 33, 36, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 45, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 39, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 42, 20, 43, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 9, 9, 11, 14, 14, 14, 17, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 0, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 26, 28, 28, 30, 33, 33, 33, 36, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 40, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, }, originalColCounts: nil, } } func (s *lexSpec) InitialMode() ModeID { return s.initialModeID } func (s *lexSpec) Pop(mode ModeID, modeKind ModeKindID) bool { return s.pop[mode][modeKind] } func (s *lexSpec) Push(mode ModeID, modeKind ModeKindID) (ModeID, bool) { id := s.push[mode][modeKind] return id, id != s.modeIDNil } func (s *lexSpec) ModeName(mode ModeID) string { return s.modeNames[mode] } func (s *lexSpec) InitialState(mode ModeID) StateID { return s.initialStates[mode] } func (s *lexSpec) NextState(mode ModeID, state StateID, v int) (StateID, bool) { rowNum := s.rowNums[mode][state] d := s.rowDisplacements[mode][rowNum] if s.bounds[mode][d+v] != rowNum { return s.stateIDNil, false } return s.entries[mode][d+v], true } func (s *lexSpec) Accept(mode ModeID, state StateID) (ModeKindID, bool) { id := s.acceptances[mode][state] return id, id != s.modeKindIDNil } func (s *lexSpec) KindIDAndName(mode ModeID, modeKind ModeKindID) (KindID, string) { id := s.kindIDs[mode][modeKind] return id, s.kindNames[id] } // Code generated by vartan-go. DO NOT EDIT. type Grammar interface { // InitialState returns the initial state of a parser. InitialState() int // StartProduction returns the start production of grammar. StartProduction() int // Action returns an ACTION entry corresponding to a (state, terminal symbol) pair. Action(state int, terminal int) int // GoTo returns a GOTO entry corresponding to a (state, non-terminal symbol) pair. GoTo(state int, lhs int) int // ErrorTrapperState returns true when a state can shift the error symbol. ErrorTrapperState(state int) bool // LHS returns a LHS symbol of a production. LHS(prod int) int // AlternativeSymbolCount returns a symbol count of p production. AlternativeSymbolCount(prod int) int // RecoverProduction returns true when a production has the recover directive. RecoverProduction(prod int) bool // NonTerminal retuns a string representaion of a non-terminal symbol. NonTerminal(nonTerminal int) string // TerminalCount returns a terminal symbol count of grammar. TerminalCount() int // SkipTerminal returns true when a terminal symbol must be skipped on syntax analysis. SkipTerminal(terminal int) bool // EOF returns the EOF symbol. EOF() int // Error returns the error symbol. Error() int // Terminal retuns a string representaion of a terminal symbol. Terminal(terminal int) string // ASTAction returns an AST action entries. ASTAction(prod int) []int } type VToken interface { // TerminalID returns a terminal ID. TerminalID() int // Lexeme returns a lexeme. Lexeme() []byte // EOF returns true when a token represents EOF. EOF() bool // Invalid returns true when a token is invalid. Invalid() bool // Position returns (row, column) pair. Position() (int, int) } type TokenStream interface { Next() (VToken, error) } type SyntaxError struct { Row int Col int Message string Token VToken ExpectedTerminals []string } type ParserOption func(p *Parser) error // DisableLAC disables LAC (lookahead correction). LAC is enabled by default. func DisableLAC() ParserOption { return func(p *Parser) error { p.disableLAC = true return nil } } func SemanticAction(semAct SemanticActionSet) ParserOption { return func(p *Parser) error { p.semAct = semAct return nil } } type Parser struct { toks TokenStream gram Grammar stateStack *stateStack semAct SemanticActionSet disableLAC bool onError bool shiftCount int synErrs []*SyntaxError } func NewParser(toks TokenStream, gram Grammar, opts ...ParserOption) (*Parser, error) { p := &Parser{ toks: toks, gram: gram, stateStack: &stateStack{}, } for _, opt := range opts { err := opt(p) if err != nil { return nil, err } } return p, nil } func (p *Parser) Parse() error { p.stateStack.push(p.gram.InitialState()) tok, err := p.nextToken() if err != nil { return err } ACTION_LOOP: for { act := p.lookupAction(tok) switch { case act < 0: // Shift nextState := act * -1 recovered := false if p.onError { p.shiftCount++ // When the parser performs shift three times, the parser recovers from the error state. if p.shiftCount >= 3 { p.onError = false p.shiftCount = 0 recovered = true } } p.shift(nextState) if p.semAct != nil { p.semAct.Shift(tok, recovered) } tok, err = p.nextToken() if err != nil { return err } case act > 0: // Reduce prodNum := act recovered := false if p.onError && p.gram.RecoverProduction(prodNum) { p.onError = false p.shiftCount = 0 recovered = true } accepted := p.reduce(prodNum) if accepted { if p.semAct != nil { p.semAct.Accept() } return nil } if p.semAct != nil { p.semAct.Reduce(prodNum, recovered) } default: // Error if p.onError { tok, err = p.nextToken() if err != nil { return err } if tok.EOF() { if p.semAct != nil { p.semAct.MissError(tok) } return nil } continue ACTION_LOOP } row, col := tok.Position() p.synErrs = append(p.synErrs, &SyntaxError{ Row: row, Col: col, Message: "unexpected token", Token: tok, ExpectedTerminals: p.searchLookahead(p.stateStack.top()), }) count, ok := p.trapError() if !ok { if p.semAct != nil { p.semAct.MissError(tok) } return nil } p.onError = true p.shiftCount = 0 act, err := p.lookupActionOnError() if err != nil { return err } p.shift(act * -1) if p.semAct != nil { p.semAct.TrapAndShiftError(tok, count) } } } } // validateLookahead validates whether `term` is a valid lookahead in the current context. When `term` is valid, // this method returns `true`. func (p *Parser) validateLookahead(term int) bool { p.stateStack.enableExploratoryMode() defer p.stateStack.disableExploratoryMode() for { act := p.gram.Action(p.stateStack.topExploratorily(), term) switch { case act < 0: // Shift return true case act > 0: // Reduce prodNum := act lhs := p.gram.LHS(prodNum) if lhs == p.gram.LHS(p.gram.StartProduction()) { return true } n := p.gram.AlternativeSymbolCount(prodNum) p.stateStack.popExploratorily(n) state := p.gram.GoTo(p.stateStack.topExploratorily(), lhs) p.stateStack.pushExploratorily(state) default: // Error return false } } } func (p *Parser) nextToken() (VToken, error) { for { // We don't have to check whether the token is invalid because the kind ID of the invalid token is 0, // and the parsing table doesn't have an entry corresponding to the kind ID 0. Thus we can detect // a syntax error because the parser cannot find an entry corresponding to the invalid token. tok, err := p.toks.Next() if err != nil { return nil, err } if p.gram.SkipTerminal(tok.TerminalID()) { continue } return tok, nil } } func (p *Parser) tokenToTerminal(tok VToken) int { if tok.EOF() { return p.gram.EOF() } return tok.TerminalID() } func (p *Parser) lookupAction(tok VToken) int { if !p.disableLAC { term := p.tokenToTerminal(tok) if !p.validateLookahead(term) { return 0 } } return p.gram.Action(p.stateStack.top(), p.tokenToTerminal(tok)) } func (p *Parser) lookupActionOnError() (int, error) { act := p.gram.Action(p.stateStack.top(), p.gram.Error()) if act >= 0 { return 0, fmt.Errorf("an entry must be a shift action by the error symbol; entry: %v, state: %v, symbol: %v", act, p.stateStack.top(), p.gram.Terminal(p.gram.Error())) } return act, nil } func (p *Parser) shift(nextState int) { p.stateStack.push(nextState) } func (p *Parser) reduce(prodNum int) bool { lhs := p.gram.LHS(prodNum) if lhs == p.gram.LHS(p.gram.StartProduction()) { return true } n := p.gram.AlternativeSymbolCount(prodNum) p.stateStack.pop(n) nextState := p.gram.GoTo(p.stateStack.top(), lhs) p.stateStack.push(nextState) return false } func (p *Parser) trapError() (int, bool) { count := 0 for { if p.gram.ErrorTrapperState(p.stateStack.top()) { return count, true } if p.stateStack.top() != p.gram.InitialState() { p.stateStack.pop(1) count++ } else { return 0, false } } } func (p *Parser) SyntaxErrors() []*SyntaxError { return p.synErrs } func (p *Parser) searchLookahead(state int) []string { kinds := []string{} termCount := p.gram.TerminalCount() for term := 0; term < termCount; term++ { if p.disableLAC { if p.gram.Action(p.stateStack.top(), term) == 0 { continue } } else { if !p.validateLookahead(term) { continue } } // We don't add the error symbol to the look-ahead symbols because users cannot input the error symbol // intentionally. if term == p.gram.Error() { continue } kinds = append(kinds, p.gram.Terminal(term)) } return kinds } type stateStack struct { items []int itemsExp []int } func (s *stateStack) enableExploratoryMode() { s.itemsExp = make([]int, len(s.items)) copy(s.itemsExp, s.items) } func (s *stateStack) disableExploratoryMode() { s.itemsExp = nil } func (s *stateStack) top() int { return s.items[len(s.items)-1] } func (s *stateStack) topExploratorily() int { return s.itemsExp[len(s.itemsExp)-1] } func (s *stateStack) push(state int) { s.items = append(s.items, state) } func (s *stateStack) pushExploratorily(state int) { s.itemsExp = append(s.itemsExp, state) } func (s *stateStack) pop(n int) { s.items = s.items[:len(s.items)-n] } func (s *stateStack) popExploratorily(n int) { s.itemsExp = s.itemsExp[:len(s.itemsExp)-n] } type grammarImpl struct { recoverProductions []int action []int goTo []int alternativeSymbolCounts []int errorTrapperStates []int nonTerminals []string lhsSymbols []int terminals []string terminalSkip []int astActions [][]int } func NewGrammar() *grammarImpl { return &grammarImpl{ recoverProductions: []int{ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, action: []int{ 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, -2, 7, 0, -11, 0, 0, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 12, 12, 0, 0, -17, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, -22, 0, 16, 16, 0, 0, 0, 0, 0, -23, -24, -25, -26, -27, -28, -29, 16, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23, -24, -25, -26, -27, -28, -29, 15, 0, 18, 0, 0, 18, 18, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 0, 25, 0, 0, 25, 25, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33, 0, 19, 0, 0, 19, 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 20, 0, 0, 20, 20, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 0, 21, 0, 0, 21, 21, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 0, 22, 0, 0, 22, 22, 0, 0, 0, 0, 0, 22, 22, 22, 22, 22, 22, 22, 22, 0, 23, 0, 0, 23, 23, 0, 0, 0, 0, 0, 23, 23, 23, 23, 23, 23, 23, 23, 0, 24, 0, 0, 24, 24, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 0, 10, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 13, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 17, 17, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 14, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, 0, 0, 0, 26, 0, 0, 26, 26, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, }, goTo: []int{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, alternativeSymbolCounts: []int{ 0, 1, 4, 4, 3, 2, 1, 0, 1, 1, 3, 1, 0, 3, 3, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, }, errorTrapperStates: []int{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, nonTerminals: []string{ "", "tree'", "tree", "tree_list", "string", "raw_string", "opt_raw_string_body", "interpreted_string", "opt_interpreted_string_body", "interpreted_string_body", "interpreted_string_elem", "codepoint_expr", }, lhsSymbols: []int{ 0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, }, terminals: []string{ "", "", "error", "ws", "l_paren", "r_paren", "identifier", "raw_string_open", "raw_string_body", "raw_string_close", "interpreted_string_open", "interpreted_seq", "codepoint_prefix", "l_brace", "r_brace", "hex_digits", "escaped_seq", "escape_char", "interpreted_string_close", }, terminalSkip: []int{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, astActions: [][]int{ nil, nil, { 2, -3, }, { 2, 3, }, { 2, }, { -1, 2, }, nil, nil, nil, nil, { -2, }, nil, nil, { -2, }, { 2, }, { -1, }, nil, { -1, -2, }, { -1, }, nil, nil, nil, nil, nil, nil, nil, { 3, }, }, } } func (g *grammarImpl) InitialState() int { return 0 } func (g *grammarImpl) StartProduction() int { return 1 } func (g *grammarImpl) RecoverProduction(prod int) bool { return g.recoverProductions[prod] != 0 } func (g *grammarImpl) Action(state int, terminal int) int { return g.action[state*19+terminal] } func (g *grammarImpl) GoTo(state int, lhs int) int { return g.goTo[state*12+lhs] } func (g *grammarImpl) AlternativeSymbolCount(prod int) int { return g.alternativeSymbolCounts[prod] } func (g *grammarImpl) TerminalCount() int { return 19 } func (g *grammarImpl) SkipTerminal(terminal int) bool { return g.terminalSkip[terminal] == 1 } func (g *grammarImpl) ErrorTrapperState(state int) bool { return g.errorTrapperStates[state] != 0 } func (g *grammarImpl) NonTerminal(nonTerminal int) string { return g.nonTerminals[nonTerminal] } func (g *grammarImpl) LHS(prod int) int { return g.lhsSymbols[prod] } func (g *grammarImpl) EOF() int { return 1 } func (g *grammarImpl) Error() int { return 2 } func (g *grammarImpl) Terminal(terminal int) string { return g.terminals[terminal] } func (g *grammarImpl) ASTAction(prod int) []int { return g.astActions[prod] } type vToken struct { terminalID int tok *Token } func (t *vToken) TerminalID() int { return t.terminalID } func (t *vToken) Lexeme() []byte { return t.tok.Lexeme } func (t *vToken) EOF() bool { return t.tok.EOF } func (t *vToken) Invalid() bool { return t.tok.Invalid } func (t *vToken) Position() (int, int) { return t.tok.Row, t.tok.Col } var kindToTerminal = []int{ 0, 3, 4, 5, 6, 7, 10, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, } type tokenStream struct { lex *Lexer kindToTerminal []int } func NewTokenStream(src io.Reader) (*tokenStream, error) { lex, err := NewLexer(NewLexSpec(), src) if err != nil { return nil, err } return &tokenStream{ lex: lex, }, nil } func (t *tokenStream) Next() (VToken, error) { tok, err := t.lex.Next() if err != nil { return nil, err } return &vToken{ terminalID: kindToTerminal[tok.KindID], tok: tok, }, nil } // Code generated by vartan-go. DO NOT EDIT. // SemanticActionSet is a set of semantic actions a parser calls. type SemanticActionSet interface { // Shift runs when the parser shifts a symbol onto a state stack. `tok` is a token corresponding to the symbol. // When the parser recovered from an error state by shifting the token, `recovered` is true. Shift(tok VToken, recovered bool) // Reduce runs when the parser reduces an RHS of a production to its LHS. `prodNum` is a number of the production. // When the parser recovered from an error state by reducing the production, `recovered` is true. Reduce(prodNum int, recovered bool) // Accept runs when the parser accepts an input. Accept() // TrapAndShiftError runs when the parser traps a syntax error and shifts a error symbol onto the state stack. // `cause` is a token that caused a syntax error. `popped` is the number of frames that the parser discards // from the state stack. // Unlike `Shift` function, this function doesn't take a token to be shifted as an argument because a token // corresponding to the error symbol doesn't exist. TrapAndShiftError(cause VToken, popped int) // MissError runs when the parser fails to trap a syntax error. `cause` is a token that caused a syntax error. MissError(cause VToken) } var _ SemanticActionSet = &SyntaxTreeActionSet{} // SyntaxTreeNode is a node of a syntax tree. A node type used in SyntaxTreeActionSet must implement SyntaxTreeNode interface. type SyntaxTreeNode interface { // ChildCount returns a child count of a node. A parser calls this method to know the child count to be expanded by an `#ast` // directive with `...` operator. ChildCount() int // ExpandChildren returns children of a node. A parser calls this method to fetch the children to be expanded by an `#ast` // directive with `...` operator. ExpandChildren() []SyntaxTreeNode } var _ SyntaxTreeNode = &Node{} // SyntaxTreeBuilder allows you to construct a syntax tree containing arbitrary user-defined node types. // The parser uses SyntaxTreeBuilder interface as a part of semantic actions via SyntaxTreeActionSet interface. type SyntaxTreeBuilder interface { Shift(kindName string, text string, row, col int) SyntaxTreeNode ShiftError(kindName string) SyntaxTreeNode Reduce(kindName string, children []SyntaxTreeNode) SyntaxTreeNode Accept(f SyntaxTreeNode) } var _ SyntaxTreeBuilder = &DefaulSyntaxTreeBuilder{} // DefaulSyntaxTreeBuilder is a implementation of SyntaxTreeBuilder. type DefaulSyntaxTreeBuilder struct { tree *Node } // NewDefaultSyntaxTreeBuilder returns a new DefaultSyntaxTreeBuilder. func NewDefaultSyntaxTreeBuilder() *DefaulSyntaxTreeBuilder { return &DefaulSyntaxTreeBuilder{} } // Shift is a implementation of SyntaxTreeBuilder.Shift. func (b *DefaulSyntaxTreeBuilder) Shift(kindName string, text string, row, col int) SyntaxTreeNode { return &Node{ Type: NodeTypeTerminal, KindName: kindName, Text: text, Row: row, Col: col, } } // ShiftError is a implementation of SyntaxTreeBuilder.ShiftError. func (b *DefaulSyntaxTreeBuilder) ShiftError(kindName string) SyntaxTreeNode { return &Node{ Type: NodeTypeError, KindName: kindName, } } // Reduce is a implementation of SyntaxTreeBuilder.Reduce. func (b *DefaulSyntaxTreeBuilder) Reduce(kindName string, children []SyntaxTreeNode) SyntaxTreeNode { cNodes := make([]*Node, len(children)) for i, c := range children { cNodes[i] = c.(*Node) } return &Node{ Type: NodeTypeNonTerminal, KindName: kindName, Children: cNodes, } } // Accept is a implementation of SyntaxTreeBuilder.Accept. func (b *DefaulSyntaxTreeBuilder) Accept(f SyntaxTreeNode) { b.tree = f.(*Node) } // Tree returns a syntax tree when the parser has accepted an input. If a syntax error occurs, the return value is nil. func (b *DefaulSyntaxTreeBuilder) Tree() *Node { return b.tree } // SyntaxTreeActionSet is a implementation of SemanticActionSet interface and constructs a syntax tree. type SyntaxTreeActionSet struct { gram Grammar builder SyntaxTreeBuilder semStack *semanticStack disableASTAction bool } // NewASTActionSet returns a new SyntaxTreeActionSet that constructs an AST (Abstract Syntax Tree). // When grammar `gram` contains `#ast` directives, the new SyntaxTreeActionSet this function returns interprets them. func NewASTActionSet(gram Grammar, builder SyntaxTreeBuilder) *SyntaxTreeActionSet { return &SyntaxTreeActionSet{ gram: gram, builder: builder, semStack: newSemanticStack(), } } // NewCSTTActionSet returns a new SyntaxTreeActionSet that constructs a CST (Concrete Syntax Tree). // Even if grammar `gram` contains `#ast` directives, the new SyntaxTreeActionSet this function returns ignores them. func NewCSTActionSet(gram Grammar, builder SyntaxTreeBuilder) *SyntaxTreeActionSet { return &SyntaxTreeActionSet{ gram: gram, builder: builder, semStack: newSemanticStack(), disableASTAction: true, } } // Shift is a implementation of SemanticActionSet.Shift method. func (a *SyntaxTreeActionSet) Shift(tok VToken, recovered bool) { term := a.tokenToTerminal(tok) row, col := tok.Position() a.semStack.push(a.builder.Shift(a.gram.Terminal(term), string(tok.Lexeme()), row, col)) } // Reduce is a implementation of SemanticActionSet.Reduce method. func (a *SyntaxTreeActionSet) Reduce(prodNum int, recovered bool) { lhs := a.gram.LHS(prodNum) // When an alternative is empty, `n` will be 0, and `handle` will be empty slice. n := a.gram.AlternativeSymbolCount(prodNum) handle := a.semStack.pop(n) var astAct []int if !a.disableASTAction { astAct = a.gram.ASTAction(prodNum) } var children []SyntaxTreeNode if astAct != nil { // Count the number of children in advance to avoid frequent growth in a slice for children. { l := 0 for _, e := range astAct { if e > 0 { l++ } else { offset := e*-1 - 1 l += handle[offset].ChildCount() } } children = make([]SyntaxTreeNode, l) } p := 0 for _, e := range astAct { if e > 0 { offset := e - 1 children[p] = handle[offset] p++ } else { offset := e*-1 - 1 for _, c := range handle[offset].ExpandChildren() { children[p] = c p++ } } } } else { // If an alternative has no AST action, a driver generates // a node with the same structure as a CST. children = handle } a.semStack.push(a.builder.Reduce(a.gram.NonTerminal(lhs), children)) } // Accept is a implementation of SemanticActionSet.Accept method. func (a *SyntaxTreeActionSet) Accept() { top := a.semStack.pop(1) a.builder.Accept(top[0]) } // TrapAndShiftError is a implementation of SemanticActionSet.TrapAndShiftError method. func (a *SyntaxTreeActionSet) TrapAndShiftError(cause VToken, popped int) { a.semStack.pop(popped) a.semStack.push(a.builder.ShiftError(a.gram.Terminal(a.gram.Error()))) } // MissError is a implementation of SemanticActionSet.MissError method. func (a *SyntaxTreeActionSet) MissError(cause VToken) { } func (a *SyntaxTreeActionSet) tokenToTerminal(tok VToken) int { if tok.EOF() { return a.gram.EOF() } return tok.TerminalID() } type semanticStack struct { frames []SyntaxTreeNode } func newSemanticStack() *semanticStack { return &semanticStack{ frames: make([]SyntaxTreeNode, 0, 100), } } func (s *semanticStack) push(f SyntaxTreeNode) { s.frames = append(s.frames, f) } func (s *semanticStack) pop(n int) []SyntaxTreeNode { fs := s.frames[len(s.frames)-n:] s.frames = s.frames[:len(s.frames)-n] return fs } type NodeType int const ( NodeTypeError = 0 NodeTypeTerminal = 1 NodeTypeNonTerminal = 2 ) // Node is a implementation of SyntaxTreeNode interface. type Node struct { Type NodeType KindName string Text string Row int Col int Children []*Node } func (n *Node) MarshalJSON() ([]byte, error) { switch n.Type { case NodeTypeError: return json.Marshal(struct { Type NodeType `json:"type"` KindName string `json:"kind_name"` }{ Type: n.Type, KindName: n.KindName, }) case NodeTypeTerminal: if n.KindName == "" { return json.Marshal(struct { Type NodeType `json:"type"` Text string `json:"text"` Row int `json:"row"` Col int `json:"col"` }{ Type: n.Type, Text: n.Text, Row: n.Row, Col: n.Col, }) } return json.Marshal(struct { Type NodeType `json:"type"` KindName string `json:"kind_name"` Text string `json:"text"` Row int `json:"row"` Col int `json:"col"` }{ Type: n.Type, KindName: n.KindName, Text: n.Text, Row: n.Row, Col: n.Col, }) case NodeTypeNonTerminal: return json.Marshal(struct { Type NodeType `json:"type"` KindName string `json:"kind_name"` Children []*Node `json:"children"` }{ Type: n.Type, KindName: n.KindName, Children: n.Children, }) default: return nil, fmt.Errorf("invalid node type: %v", n.Type) } } // ChildCount is a implementation of SyntaxTreeNode.ChildCount. func (n *Node) ChildCount() int { return len(n.Children) } // ExpandChildren is a implementation of SyntaxTreeNode.ExpandChildren. func (n *Node) ExpandChildren() []SyntaxTreeNode { fs := make([]SyntaxTreeNode, len(n.Children)) for i, n := range n.Children { fs[i] = n } return fs } // PrintTree prints a syntax tree whose root is `node`. func PrintTree(w io.Writer, node *Node) { printTree(w, node, "", "") } func printTree(w io.Writer, node *Node, ruledLine string, childRuledLinePrefix string) { if node == nil { return } switch node.Type { case NodeTypeError: fmt.Fprintf(w, "%v%v\n", ruledLine, node.KindName) case NodeTypeTerminal: fmt.Fprintf(w, "%v%v %v\n", ruledLine, node.KindName, strconv.Quote(node.Text)) case NodeTypeNonTerminal: fmt.Fprintf(w, "%v%v\n", ruledLine, node.KindName) num := len(node.Children) for i, child := range node.Children { var line string if num > 1 && i < num-1 { line = "├─ " } else { line = "└─ " } var prefix string if i >= num-1 { prefix = " " } else { prefix = "│ " } printTree(w, child, childRuledLinePrefix+line, childRuledLinePrefix+prefix) } } }