From 5f9467e8516e28dbcb68a0710edc0dcb08062116 Mon Sep 17 00:00:00 2001 From: mae Date: Mon, 26 Jan 2026 20:52:51 -0600 Subject: [PATCH] feat/schema: add parser --- schema/azschema.bnf | 34 +- schema/errors/errors.go | 108 ++ schema/lexer/acttab.go | 98 +- schema/lexer/lexer.go | 94 +- schema/lexer/transitiontable.go | 2016 +++++++++++++++++------------ schema/main.go | 2 +- schema/parser/action.go | 51 + schema/parser/actiontable.go | 599 +++++++++ schema/parser/context.go | 7 + schema/parser/gototable.go | 373 ++++++ schema/parser/parser.go | 217 ++++ schema/parser/productionstable.go | 160 +++ schema/token/token.go | 14 +- 13 files changed, 2860 insertions(+), 913 deletions(-) create mode 100644 schema/errors/errors.go create mode 100644 schema/parser/action.go create mode 100644 schema/parser/actiontable.go create mode 100644 schema/parser/context.go create mode 100644 schema/parser/gototable.go create mode 100644 schema/parser/parser.go create mode 100644 schema/parser/productionstable.go diff --git a/schema/azschema.bnf b/schema/azschema.bnf index 0937c22..0792348 100644 --- a/schema/azschema.bnf +++ b/schema/azschema.bnf @@ -4,15 +4,37 @@ _bin_digit: '0' - '1'; _oct_digit: _bin_digit | '2' - '7'; _dec_digit: _oct_digit | '8' - '9'; _hex_digit: _dec_digit | 'A' - 'F' | 'a' - 'f'; -_negative: '-'; -number: [_negative] '0' 'b' _bin_digit {_bin_digit} - | [_negative] '0' 'o' _oct_digit {_oct_digit} - | [_negative] _dec_digit {_dec_digit} - | [_negative] '0' 'x' _hex_digit {_hex_digit}; +number: ['-' | '+'] '0' 'b' _bin_digit {_bin_digit | '_'} + | ['-' | '+'] '0' 'o' _oct_digit {_oct_digit | '_'} + | ['-' | '+'] _dec_digit {_dec_digit | '_'} + | ['-' | '+'] '0' 'x' _hex_digit {_hex_digit | '_'}; _name_initial: 'A' - 'Z' | 'a' - 'z' | '_' | '~' | '!' | '@' | '#' | '$' | '%' | '^' | '&' | '*' | '-' | '_' | '+' | '=' | '?' | '/' | '.' | '\''; _name_char: _name_initial | _dec_digit; name: _name_initial {_name_char}; !whitespace: ' ' | '\t' | '\n' | '\r'; -!comment: ';' {.} '\n'; \ No newline at end of file +!comment: ';' {.} '\n'; + +<<>> +Schema: ExprList; +ExprList + : Expr + | ExprList Expr + ; +ValList + : Val + | ValList Val + ; +Val + : string + | number + | name + | Expr + ; +Expr + : "(" name Val Val ")" + | "(" name Val ")" + | "(" name ")" + | "(" "." ValList ")" + ; \ No newline at end of file diff --git a/schema/errors/errors.go b/schema/errors/errors.go new file mode 100644 index 0000000..770affa --- /dev/null +++ b/schema/errors/errors.go @@ -0,0 +1,108 @@ +// Code generated by gocc; DO NOT EDIT. + +package errors + +import ( + "fmt" + "strconv" + "strings" + "unicode" + + "azalea/schema/token" +) + +type ErrorSymbol interface { +} + +type Error struct { + Err error + ErrorToken *token.Token + ErrorSymbols []ErrorSymbol + ExpectedTokens []string + StackTop int +} + +func (e *Error) String() string { + w := new(strings.Builder) + if e.Err != nil { + fmt.Fprintln(w, "Error ", e.Err) + } else { + fmt.Fprintln(w, "Error") + } + fmt.Fprintf(w, "Token: type=%d, lit=%s\n", e.ErrorToken.Type, e.ErrorToken.Lit) + fmt.Fprintf(w, "Pos: offset=%d, line=%d, column=%d\n", e.ErrorToken.Pos.Offset, e.ErrorToken.Pos.Line, e.ErrorToken.Pos.Column) + fmt.Fprint(w, "Expected one of: ") + for _, sym := range e.ExpectedTokens { + fmt.Fprint(w, string(sym), " ") + } + fmt.Fprintln(w, "ErrorSymbol:") + for _, sym := range e.ErrorSymbols { + fmt.Fprintf(w, "%v\n", sym) + } + + return w.String() +} + +func DescribeExpected(tokens []string) string { + switch len(tokens) { + case 0: + return "unexpected additional tokens" + + case 1: + return "expected " + tokens[0] + + case 2: + return "expected either " + tokens[0] + " or " + tokens[1] + + case 3: + // Oxford-comma rules require more than 3 items in a list for the + // comma to appear before the 'or' + return fmt.Sprintf("expected one of %s, %s or %s", tokens[0], tokens[1], tokens[2]) + + default: + // Oxford-comma separated alternatives list. + tokens = append(tokens[:len(tokens)-1], "or "+tokens[len(tokens)-1]) + return "expected one of " + strings.Join(tokens, ", ") + } +} + +func DescribeToken(tok *token.Token) string { + switch tok.Type { + case token.INVALID: + return fmt.Sprintf("unknown/invalid token %q", tok.Lit) + case token.EOF: + return "end-of-file" + default: + return fmt.Sprintf("%q", tok.Lit) + } +} + +func (e *Error) Error() string { + // identify the line and column of the error in 'gnu' style so it can be understood + // by editors and IDEs; user will need to prefix it with a filename. + text := fmt.Sprintf("%d:%d: error: ", e.ErrorToken.Pos.Line, e.ErrorToken.Pos.Column) + + // See if the error token can provide us with the filename. + switch src := e.ErrorToken.Pos.Context.(type) { + case token.Sourcer: + text = src.Source() + ":" + text + } + + if e.Err != nil { + // Custom error specified, e.g. by << nil, errors.New("missing newline") >> + text += e.Err.Error() + } else { + tokens := make([]string, len(e.ExpectedTokens)) + for idx, token := range e.ExpectedTokens { + if !unicode.IsLetter(rune(token[0])) { + token = strconv.Quote(token) + } + tokens[idx] = token + } + text += DescribeExpected(tokens) + actual := DescribeToken(e.ErrorToken) + text += fmt.Sprintf("; got: %s", actual) + } + + return text +} diff --git a/schema/lexer/acttab.go b/schema/lexer/acttab.go index 91148b1..0a61208 100644 --- a/schema/lexer/acttab.go +++ b/schema/lexer/acttab.go @@ -29,7 +29,7 @@ var ActTab = ActionTable{ Ignore: "!whitespace", }, ActionRow{ // S2 - Accept: 2, + Accept: 4, Ignore: "", }, ActionRow{ // S3 @@ -37,19 +37,19 @@ var ActTab = ActionTable{ Ignore: "", }, ActionRow{ // S4 - Accept: 2, + Accept: 5, Ignore: "", }, ActionRow{ // S5 - Accept: 3, + Accept: 6, Ignore: "", }, ActionRow{ // S6 - Accept: 3, + Accept: 4, Ignore: "", }, ActionRow{ // S7 - Accept: 3, + Accept: 7, Ignore: "", }, ActionRow{ // S8 @@ -57,27 +57,27 @@ var ActTab = ActionTable{ Ignore: "", }, ActionRow{ // S9 - Accept: 0, + Accept: 3, Ignore: "", }, ActionRow{ // S10 - Accept: 0, + Accept: 3, Ignore: "", }, ActionRow{ // S11 - Accept: 2, + Accept: 3, Ignore: "", }, ActionRow{ // S12 - Accept: 2, + Accept: 0, Ignore: "", }, ActionRow{ // S13 - Accept: 2, + Accept: 0, Ignore: "", }, ActionRow{ // S14 - Accept: 2, + Accept: 4, Ignore: "", }, ActionRow{ // S15 @@ -85,15 +85,15 @@ var ActTab = ActionTable{ Ignore: "", }, ActionRow{ // S16 - Accept: 3, + Accept: 4, Ignore: "", }, ActionRow{ // S17 - Accept: 3, + Accept: 4, Ignore: "", }, ActionRow{ // S18 - Accept: 3, + Accept: 2, Ignore: "", }, ActionRow{ // S19 @@ -101,51 +101,51 @@ var ActTab = ActionTable{ Ignore: "", }, ActionRow{ // S20 - Accept: 0, + Accept: 3, Ignore: "", }, ActionRow{ // S21 - Accept: 0, + Accept: 3, Ignore: "", }, ActionRow{ // S22 - Accept: 0, + Accept: 3, Ignore: "", }, ActionRow{ // S23 - Accept: -1, - Ignore: "!comment", + Accept: 3, + Ignore: "", }, ActionRow{ // S24 - Accept: 2, + Accept: 0, Ignore: "", }, ActionRow{ // S25 - Accept: 2, + Accept: 0, Ignore: "", }, ActionRow{ // S26 - Accept: 2, + Accept: 0, Ignore: "", }, ActionRow{ // S27 - Accept: 3, - Ignore: "", + Accept: -1, + Ignore: "!comment", }, ActionRow{ // S28 Accept: 3, Ignore: "", }, ActionRow{ // S29 - Accept: 3, + Accept: 4, Ignore: "", }, ActionRow{ // S30 - Accept: 3, + Accept: 4, Ignore: "", }, ActionRow{ // S31 - Accept: 3, + Accept: 4, Ignore: "", }, ActionRow{ // S32 @@ -184,4 +184,48 @@ var ActTab = ActionTable{ Accept: 3, Ignore: "", }, + ActionRow{ // S41 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S42 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S43 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S44 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S45 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S46 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S47 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S48 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S49 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S50 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S51 + Accept: 3, + Ignore: "", + }, } diff --git a/schema/lexer/lexer.go b/schema/lexer/lexer.go index 042c5c6..4761ce2 100644 --- a/schema/lexer/lexer.go +++ b/schema/lexer/lexer.go @@ -11,8 +11,8 @@ import ( const ( NoState = -1 - NumStates = 41 - NumSymbols = 43 + NumStates = 52 + NumSymbols = 57 ) type Lexer struct { @@ -133,43 +133,57 @@ Lexer symbols: 1: '`' 2: '"' 3: '"' -4: '0' -5: 'b' +4: '-' +5: '+' 6: '0' -7: 'o' -8: '0' -9: 'x' -10: '-' -11: '_' -12: '~' -13: '!' -14: '@' -15: '#' -16: '$' -17: '%' -18: '^' -19: '&' -20: '*' -21: '-' -22: '_' -23: '+' -24: '=' -25: '?' -26: '/' -27: '.' -28: ''' -29: ' ' -30: '\t' -31: '\n' -32: '\r' -33: ';' -34: '\n' -35: '0'-'1' -36: '2'-'7' -37: '8'-'9' -38: 'A'-'F' -39: 'a'-'f' -40: 'A'-'Z' -41: 'a'-'z' -42: . +7: 'b' +8: '_' +9: '-' +10: '+' +11: '0' +12: 'o' +13: '_' +14: '-' +15: '+' +16: '_' +17: '-' +18: '+' +19: '0' +20: 'x' +21: '_' +22: '(' +23: ')' +24: '.' +25: '_' +26: '~' +27: '!' +28: '@' +29: '#' +30: '$' +31: '%' +32: '^' +33: '&' +34: '*' +35: '-' +36: '_' +37: '+' +38: '=' +39: '?' +40: '/' +41: '.' +42: ''' +43: ' ' +44: '\t' +45: '\n' +46: '\r' +47: ';' +48: '\n' +49: '0'-'1' +50: '2'-'7' +51: '8'-'9' +52: 'A'-'F' +53: 'a'-'f' +54: 'A'-'Z' +55: 'a'-'z' +56: . */ diff --git a/schema/lexer/transitiontable.go b/schema/lexer/transitiontable.go index b909884..9a4fcb2 100644 --- a/schema/lexer/transitiontable.go +++ b/schema/lexer/transitiontable.go @@ -35,26 +35,30 @@ var TransTab = TransitionTable{ return 2 case r == 39: // [''','''] return 2 + case r == 40: // ['(','('] + return 4 + case r == 41: // [')',')'] + return 5 case r == 42: // ['*','*'] return 2 case r == 43: // ['+','+'] - return 2 + return 6 case r == 45: // ['-','-'] - return 4 + return 6 case r == 46: // ['.','.'] - return 2 + return 7 case r == 47: // ['/','/'] return 2 case r == 48: // ['0','0'] - return 5 - case r == 49: // ['1','1'] - return 6 - case 50 <= r && r <= 55: // ['2','7'] - return 7 - case 56 <= r && r <= 57: // ['8','9'] return 8 - case r == 59: // [';',';'] + case r == 49: // ['1','1'] return 9 + case 50 <= r && r <= 55: // ['2','7'] + return 10 + case 56 <= r && r <= 57: // ['8','9'] + return 11 + case r == 59: // [';',';'] + return 12 case r == 61: // ['=','='] return 2 case r == 63: // ['?','?'] @@ -68,7 +72,7 @@ var TransTab = TransitionTable{ case r == 95: // ['_','_'] return 2 case r == 96: // ['`','`'] - return 10 + return 13 case 97 <= r && r <= 122: // ['a','z'] return 2 case r == 126: // ['~','~'] @@ -86,49 +90,49 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 - case 48 <= r && r <= 49: // ['0','1'] - return 12 - case 50 <= r && r <= 55: // ['2','7'] - return 13 - case 56 <= r && r <= 57: // ['8','9'] return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 15 + case 50 <= r && r <= 55: // ['2','7'] + return 16 + case 56 <= r && r <= 57: // ['8','9'] + return 17 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 + return 14 case 65 <= r && r <= 90: // ['A','Z'] - return 11 + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 + return 14 case 97 <= r && r <= 122: // ['a','z'] - return 11 + return 14 case r == 126: // ['~','~'] - return 11 + return 14 } return NoState }, @@ -136,7 +140,7 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 34: // ['"','"'] - return 15 + return 18 default: return 3 } @@ -144,94 +148,114 @@ var TransTab = TransitionTable{ // S4 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 - case r == 48: // ['0','0'] - return 16 - case r == 49: // ['1','1'] - return 17 - case 50 <= r && r <= 55: // ['2','7'] - return 18 - case 56 <= r && r <= 57: // ['8','9'] - return 19 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 } return NoState }, // S5 func(r rune) int { switch { - case 48 <= r && r <= 49: // ['0','1'] - return 6 - case 50 <= r && r <= 55: // ['2','7'] - return 7 - case 56 <= r && r <= 57: // ['8','9'] - return 8 - case r == 98: // ['b','b'] - return 20 - case r == 111: // ['o','o'] - return 21 - case r == 120: // ['x','x'] - return 22 } return NoState }, // S6 func(r rune) int { switch { - case 48 <= r && r <= 49: // ['0','1'] - return 6 + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case r == 48: // ['0','0'] + return 19 + case r == 49: // ['1','1'] + return 20 case 50 <= r && r <= 55: // ['2','7'] - return 7 + return 21 case 56 <= r && r <= 57: // ['8','9'] - return 8 + return 22 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 14 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S7 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 6 + return 15 case 50 <= r && r <= 55: // ['2','7'] - return 7 + return 16 case 56 <= r && r <= 57: // ['8','9'] - return 8 + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 14 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, @@ -239,235 +263,179 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case 48 <= r && r <= 49: // ['0','1'] - return 6 + return 9 case 50 <= r && r <= 55: // ['2','7'] - return 7 + return 10 case 56 <= r && r <= 57: // ['8','9'] - return 8 + return 11 + case r == 95: // ['_','_'] + return 23 + case r == 98: // ['b','b'] + return 24 + case r == 111: // ['o','o'] + return 25 + case r == 120: // ['x','x'] + return 26 } return NoState }, // S9 func(r rune) int { switch { - case r == 10: // ['\n','\n'] - return 23 - default: + case 48 <= r && r <= 49: // ['0','1'] return 9 + case 50 <= r && r <= 55: // ['2','7'] + return 10 + case 56 <= r && r <= 57: // ['8','9'] + return 11 + case r == 95: // ['_','_'] + return 23 } + return NoState }, // S10 func(r rune) int { switch { - case r == 96: // ['`','`'] - return 15 - default: + case 48 <= r && r <= 49: // ['0','1'] + return 9 + case 50 <= r && r <= 55: // ['2','7'] return 10 + case 56 <= r && r <= 57: // ['8','9'] + return 11 + case r == 95: // ['_','_'] + return 23 } + return NoState }, // S11 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 12 + return 9 case 50 <= r && r <= 55: // ['2','7'] - return 13 + return 10 case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] return 11 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 23 } return NoState }, // S12 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 - case 48 <= r && r <= 49: // ['0','1'] + case r == 10: // ['\n','\n'] + return 27 + default: return 12 - case 50 <= r && r <= 55: // ['2','7'] - return 13 - case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 } - return NoState }, // S13 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 - case 48 <= r && r <= 49: // ['0','1'] - return 12 - case 50 <= r && r <= 55: // ['2','7'] + case r == 96: // ['`','`'] + return 18 + default: return 13 - case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 } - return NoState }, // S14 func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 - case 48 <= r && r <= 49: // ['0','1'] - return 12 - case 50 <= r && r <= 55: // ['2','7'] - return 13 - case 56 <= r && r <= 57: // ['8','9'] return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 15 + case 50 <= r && r <= 55: // ['2','7'] + return 16 + case 56 <= r && r <= 57: // ['8','9'] + return 17 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 + return 14 case 65 <= r && r <= 90: // ['A','Z'] - return 11 + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 + return 14 case 97 <= r && r <= 122: // ['a','z'] - return 11 + return 14 case r == 126: // ['~','~'] - return 11 + return 14 } return NoState }, // S15 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 15 + case 50 <= r && r <= 55: // ['2','7'] + return 16 + case 56 <= r && r <= 57: // ['8','9'] + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 14 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, @@ -475,61 +443,49 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 + return 14 case r == 35: // ['#','#'] - return 11 + return 14 case r == 36: // ['$','$'] - return 11 + return 14 case r == 37: // ['%','%'] - return 11 + return 14 case r == 38: // ['&','&'] - return 11 + return 14 case r == 39: // [''','''] - return 11 + return 14 case r == 42: // ['*','*'] - return 11 + return 14 case r == 43: // ['+','+'] - return 11 + return 14 case r == 45: // ['-','-'] - return 11 + return 14 case r == 46: // ['.','.'] - return 11 + return 14 case r == 47: // ['/','/'] - return 11 + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 17 + return 15 case 50 <= r && r <= 55: // ['2','7'] - return 18 + return 16 case 56 <= r && r <= 57: // ['8','9'] - return 19 + return 17 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 + return 14 case 65 <= r && r <= 90: // ['A','Z'] - return 11 + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 - case r == 97: // ['a','a'] - return 11 - case r == 98: // ['b','b'] - return 24 - case 99 <= r && r <= 110: // ['c','n'] - return 11 - case r == 111: // ['o','o'] - return 25 - case 112 <= r && r <= 119: // ['p','w'] - return 11 - case r == 120: // ['x','x'] - return 26 - case 121 <= r && r <= 122: // ['y','z'] - return 11 + return 14 + case 97 <= r && r <= 122: // ['a','z'] + return 14 case r == 126: // ['~','~'] - return 11 + return 14 } return NoState }, @@ -537,99 +493,55 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 + return 14 case r == 35: // ['#','#'] - return 11 + return 14 case r == 36: // ['$','$'] - return 11 + return 14 case r == 37: // ['%','%'] - return 11 + return 14 case r == 38: // ['&','&'] - return 11 + return 14 case r == 39: // [''','''] - return 11 + return 14 case r == 42: // ['*','*'] - return 11 + return 14 case r == 43: // ['+','+'] - return 11 + return 14 case r == 45: // ['-','-'] - return 11 + return 14 case r == 46: // ['.','.'] - return 11 + return 14 case r == 47: // ['/','/'] - return 11 + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 17 + return 15 case 50 <= r && r <= 55: // ['2','7'] - return 18 + return 16 case 56 <= r && r <= 57: // ['8','9'] - return 19 + return 17 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 + return 14 case 65 <= r && r <= 90: // ['A','Z'] - return 11 + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 + return 14 case 97 <= r && r <= 122: // ['a','z'] - return 11 + return 14 case r == 126: // ['~','~'] - return 11 + return 14 } return NoState }, // S18 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 - case 48 <= r && r <= 49: // ['0','1'] - return 17 - case 50 <= r && r <= 55: // ['2','7'] - return 18 - case 56 <= r && r <= 57: // ['8','9'] - return 19 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 } return NoState }, @@ -637,303 +549,469 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 + return 14 case r == 35: // ['#','#'] - return 11 + return 14 case r == 36: // ['$','$'] - return 11 + return 14 case r == 37: // ['%','%'] - return 11 + return 14 case r == 38: // ['&','&'] - return 11 + return 14 case r == 39: // [''','''] - return 11 + return 14 case r == 42: // ['*','*'] - return 11 + return 14 case r == 43: // ['+','+'] - return 11 + return 14 case r == 45: // ['-','-'] - return 11 + return 14 case r == 46: // ['.','.'] - return 11 + return 14 case r == 47: // ['/','/'] - return 11 + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 17 + return 20 case 50 <= r && r <= 55: // ['2','7'] - return 18 + return 21 case 56 <= r && r <= 57: // ['8','9'] - return 19 + return 22 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 + return 14 case 65 <= r && r <= 90: // ['A','Z'] - return 11 + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 + return 28 + case r == 97: // ['a','a'] + return 14 + case r == 98: // ['b','b'] + return 29 + case 99 <= r && r <= 110: // ['c','n'] + return 14 + case r == 111: // ['o','o'] + return 30 + case 112 <= r && r <= 119: // ['p','w'] + return 14 + case r == 120: // ['x','x'] + return 31 + case 121 <= r && r <= 122: // ['y','z'] + return 14 case r == 126: // ['~','~'] - return 11 + return 14 } return NoState }, // S20 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 27 + return 20 + case 50 <= r && r <= 55: // ['2','7'] + return 21 + case 56 <= r && r <= 57: // ['8','9'] + return 22 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 28 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S21 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 28 + return 20 case 50 <= r && r <= 55: // ['2','7'] - return 29 + return 21 + case 56 <= r && r <= 57: // ['8','9'] + return 22 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 28 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S22 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 30 + return 20 case 50 <= r && r <= 55: // ['2','7'] - return 31 + return 21 case 56 <= r && r <= 57: // ['8','9'] - return 32 - case 65 <= r && r <= 70: // ['A','F'] - return 33 - case 97 <= r && r <= 102: // ['a','f'] - return 33 + return 22 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 28 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S23 func(r rune) int { switch { + case 48 <= r && r <= 49: // ['0','1'] + return 9 + case 50 <= r && r <= 55: // ['2','7'] + return 10 + case 56 <= r && r <= 57: // ['8','9'] + return 11 + case r == 95: // ['_','_'] + return 23 } return NoState }, // S24 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 34 - case 50 <= r && r <= 55: // ['2','7'] - return 13 - case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 32 } return NoState }, // S25 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 35 + return 33 case 50 <= r && r <= 55: // ['2','7'] - return 36 - case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 34 } return NoState }, // S26 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 37 + return 35 case 50 <= r && r <= 55: // ['2','7'] - return 38 + return 36 case 56 <= r && r <= 57: // ['8','9'] - return 39 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 + return 37 case 65 <= r && r <= 70: // ['A','F'] - return 40 - case 71 <= r && r <= 90: // ['G','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 - case r == 95: // ['_','_'] - return 11 + return 38 case 97 <= r && r <= 102: // ['a','f'] - return 40 - case 103 <= r && r <= 122: // ['g','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 38 } return NoState }, // S27 func(r rune) int { switch { - case 48 <= r && r <= 49: // ['0','1'] - return 27 } return NoState }, // S28 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 28 + return 20 case 50 <= r && r <= 55: // ['2','7'] - return 29 + return 21 + case 56 <= r && r <= 57: // ['8','9'] + return 22 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 28 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S29 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 28 + return 39 case 50 <= r && r <= 55: // ['2','7'] - return 29 + return 16 + case 56 <= r && r <= 57: // ['8','9'] + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 14 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S30 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 30 + return 40 case 50 <= r && r <= 55: // ['2','7'] - return 31 + return 41 case 56 <= r && r <= 57: // ['8','9'] - return 32 - case 65 <= r && r <= 70: // ['A','F'] - return 33 - case 97 <= r && r <= 102: // ['a','f'] - return 33 + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 14 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, // S31 func(r rune) int { switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 30 + return 42 case 50 <= r && r <= 55: // ['2','7'] - return 31 + return 43 case 56 <= r && r <= 57: // ['8','9'] - return 32 + return 44 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 case 65 <= r && r <= 70: // ['A','F'] - return 33 + return 45 + case 71 <= r && r <= 90: // ['G','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 14 case 97 <= r && r <= 102: // ['a','f'] - return 33 + return 45 + case 103 <= r && r <= 122: // ['g','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, @@ -941,15 +1019,9 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case 48 <= r && r <= 49: // ['0','1'] - return 30 - case 50 <= r && r <= 55: // ['2','7'] - return 31 - case 56 <= r && r <= 57: // ['8','9'] return 32 - case 65 <= r && r <= 70: // ['A','F'] - return 33 - case 97 <= r && r <= 102: // ['a','f'] - return 33 + case r == 95: // ['_','_'] + return 46 } return NoState }, @@ -957,273 +1029,95 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case 48 <= r && r <= 49: // ['0','1'] - return 30 + return 33 case 50 <= r && r <= 55: // ['2','7'] - return 31 - case 56 <= r && r <= 57: // ['8','9'] - return 32 - case 65 <= r && r <= 70: // ['A','F'] - return 33 - case 97 <= r && r <= 102: // ['a','f'] - return 33 + return 34 + case r == 95: // ['_','_'] + return 47 } return NoState }, // S34 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 34 + return 33 case 50 <= r && r <= 55: // ['2','7'] - return 13 - case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 + return 34 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 47 } return NoState }, // S35 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] return 35 case 50 <= r && r <= 55: // ['2','7'] return 36 case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 + return 37 + case 65 <= r && r <= 70: // ['A','F'] + return 38 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 48 + case 97 <= r && r <= 102: // ['a','f'] + return 38 } return NoState }, // S36 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] return 35 case 50 <= r && r <= 55: // ['2','7'] return 36 case 56 <= r && r <= 57: // ['8','9'] - return 14 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 90: // ['A','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 + return 37 + case 65 <= r && r <= 70: // ['A','F'] + return 38 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 122: // ['a','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 48 + case 97 <= r && r <= 102: // ['a','f'] + return 38 } return NoState }, // S37 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 37 + return 35 case 50 <= r && r <= 55: // ['2','7'] - return 38 + return 36 case 56 <= r && r <= 57: // ['8','9'] - return 39 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 + return 37 case 65 <= r && r <= 70: // ['A','F'] - return 40 - case 71 <= r && r <= 90: // ['G','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 + return 38 case r == 95: // ['_','_'] - return 11 + return 48 case 97 <= r && r <= 102: // ['a','f'] - return 40 - case 103 <= r && r <= 122: // ['g','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 38 } return NoState }, // S38 func(r rune) int { switch { - case r == 33: // ['!','!'] - return 11 - case r == 35: // ['#','#'] - return 11 - case r == 36: // ['$','$'] - return 11 - case r == 37: // ['%','%'] - return 11 - case r == 38: // ['&','&'] - return 11 - case r == 39: // [''','''] - return 11 - case r == 42: // ['*','*'] - return 11 - case r == 43: // ['+','+'] - return 11 - case r == 45: // ['-','-'] - return 11 - case r == 46: // ['.','.'] - return 11 - case r == 47: // ['/','/'] - return 11 case 48 <= r && r <= 49: // ['0','1'] - return 37 + return 35 case 50 <= r && r <= 55: // ['2','7'] - return 38 + return 36 case 56 <= r && r <= 57: // ['8','9'] - return 39 - case r == 61: // ['=','='] - return 11 - case r == 63: // ['?','?'] - return 11 - case r == 64: // ['@','@'] - return 11 + return 37 case 65 <= r && r <= 70: // ['A','F'] - return 40 - case 71 <= r && r <= 90: // ['G','Z'] - return 11 - case r == 94: // ['^','^'] - return 11 + return 38 case r == 95: // ['_','_'] - return 11 + return 48 case 97 <= r && r <= 102: // ['a','f'] - return 40 - case 103 <= r && r <= 122: // ['g','z'] - return 11 - case r == 126: // ['~','~'] - return 11 + return 38 } return NoState }, @@ -1231,53 +1125,49 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 + return 14 case r == 35: // ['#','#'] - return 11 + return 14 case r == 36: // ['$','$'] - return 11 + return 14 case r == 37: // ['%','%'] - return 11 + return 14 case r == 38: // ['&','&'] - return 11 + return 14 case r == 39: // [''','''] - return 11 + return 14 case r == 42: // ['*','*'] - return 11 + return 14 case r == 43: // ['+','+'] - return 11 + return 14 case r == 45: // ['-','-'] - return 11 + return 14 case r == 46: // ['.','.'] - return 11 + return 14 case r == 47: // ['/','/'] - return 11 + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 37 - case 50 <= r && r <= 55: // ['2','7'] - return 38 - case 56 <= r && r <= 57: // ['8','9'] return 39 + case 50 <= r && r <= 55: // ['2','7'] + return 16 + case 56 <= r && r <= 57: // ['8','9'] + return 17 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 70: // ['A','F'] - return 40 - case 71 <= r && r <= 90: // ['G','Z'] - return 11 + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 102: // ['a','f'] - return 40 - case 103 <= r && r <= 122: // ['g','z'] - return 11 + return 49 + case 97 <= r && r <= 122: // ['a','z'] + return 14 case r == 126: // ['~','~'] - return 11 + return 14 } return NoState }, @@ -1285,53 +1175,509 @@ var TransTab = TransitionTable{ func(r rune) int { switch { case r == 33: // ['!','!'] - return 11 + return 14 case r == 35: // ['#','#'] - return 11 + return 14 case r == 36: // ['$','$'] - return 11 + return 14 case r == 37: // ['%','%'] - return 11 + return 14 case r == 38: // ['&','&'] - return 11 + return 14 case r == 39: // [''','''] - return 11 + return 14 case r == 42: // ['*','*'] - return 11 + return 14 case r == 43: // ['+','+'] - return 11 + return 14 case r == 45: // ['-','-'] - return 11 + return 14 case r == 46: // ['.','.'] - return 11 + return 14 case r == 47: // ['/','/'] - return 11 + return 14 case 48 <= r && r <= 49: // ['0','1'] - return 37 + return 40 case 50 <= r && r <= 55: // ['2','7'] - return 38 + return 41 case 56 <= r && r <= 57: // ['8','9'] - return 39 + return 17 case r == 61: // ['=','='] - return 11 + return 14 case r == 63: // ['?','?'] - return 11 + return 14 case r == 64: // ['@','@'] - return 11 - case 65 <= r && r <= 70: // ['A','F'] - return 40 - case 71 <= r && r <= 90: // ['G','Z'] - return 11 + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 case r == 94: // ['^','^'] - return 11 + return 14 case r == 95: // ['_','_'] - return 11 - case 97 <= r && r <= 102: // ['a','f'] - return 40 - case 103 <= r && r <= 122: // ['g','z'] - return 11 + return 50 + case 97 <= r && r <= 122: // ['a','z'] + return 14 case r == 126: // ['~','~'] - return 11 + return 14 + } + return NoState + }, + // S41 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 40 + case 50 <= r && r <= 55: // ['2','7'] + return 41 + case 56 <= r && r <= 57: // ['8','9'] + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 50 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S42 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 42 + case 50 <= r && r <= 55: // ['2','7'] + return 43 + case 56 <= r && r <= 57: // ['8','9'] + return 44 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 70: // ['A','F'] + return 45 + case 71 <= r && r <= 90: // ['G','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 51 + case 97 <= r && r <= 102: // ['a','f'] + return 45 + case 103 <= r && r <= 122: // ['g','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S43 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 42 + case 50 <= r && r <= 55: // ['2','7'] + return 43 + case 56 <= r && r <= 57: // ['8','9'] + return 44 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 70: // ['A','F'] + return 45 + case 71 <= r && r <= 90: // ['G','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 51 + case 97 <= r && r <= 102: // ['a','f'] + return 45 + case 103 <= r && r <= 122: // ['g','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S44 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 42 + case 50 <= r && r <= 55: // ['2','7'] + return 43 + case 56 <= r && r <= 57: // ['8','9'] + return 44 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 70: // ['A','F'] + return 45 + case 71 <= r && r <= 90: // ['G','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 51 + case 97 <= r && r <= 102: // ['a','f'] + return 45 + case 103 <= r && r <= 122: // ['g','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S45 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 42 + case 50 <= r && r <= 55: // ['2','7'] + return 43 + case 56 <= r && r <= 57: // ['8','9'] + return 44 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 70: // ['A','F'] + return 45 + case 71 <= r && r <= 90: // ['G','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 51 + case 97 <= r && r <= 102: // ['a','f'] + return 45 + case 103 <= r && r <= 122: // ['g','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S46 + func(r rune) int { + switch { + case 48 <= r && r <= 49: // ['0','1'] + return 32 + case r == 95: // ['_','_'] + return 46 + } + return NoState + }, + // S47 + func(r rune) int { + switch { + case 48 <= r && r <= 49: // ['0','1'] + return 33 + case 50 <= r && r <= 55: // ['2','7'] + return 34 + case r == 95: // ['_','_'] + return 47 + } + return NoState + }, + // S48 + func(r rune) int { + switch { + case 48 <= r && r <= 49: // ['0','1'] + return 35 + case 50 <= r && r <= 55: // ['2','7'] + return 36 + case 56 <= r && r <= 57: // ['8','9'] + return 37 + case 65 <= r && r <= 70: // ['A','F'] + return 38 + case r == 95: // ['_','_'] + return 48 + case 97 <= r && r <= 102: // ['a','f'] + return 38 + } + return NoState + }, + // S49 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 39 + case 50 <= r && r <= 55: // ['2','7'] + return 16 + case 56 <= r && r <= 57: // ['8','9'] + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 49 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S50 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 40 + case 50 <= r && r <= 55: // ['2','7'] + return 41 + case 56 <= r && r <= 57: // ['8','9'] + return 17 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 90: // ['A','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 50 + case 97 <= r && r <= 122: // ['a','z'] + return 14 + case r == 126: // ['~','~'] + return 14 + } + return NoState + }, + // S51 + func(r rune) int { + switch { + case r == 33: // ['!','!'] + return 14 + case r == 35: // ['#','#'] + return 14 + case r == 36: // ['$','$'] + return 14 + case r == 37: // ['%','%'] + return 14 + case r == 38: // ['&','&'] + return 14 + case r == 39: // [''','''] + return 14 + case r == 42: // ['*','*'] + return 14 + case r == 43: // ['+','+'] + return 14 + case r == 45: // ['-','-'] + return 14 + case r == 46: // ['.','.'] + return 14 + case r == 47: // ['/','/'] + return 14 + case 48 <= r && r <= 49: // ['0','1'] + return 42 + case 50 <= r && r <= 55: // ['2','7'] + return 43 + case 56 <= r && r <= 57: // ['8','9'] + return 44 + case r == 61: // ['=','='] + return 14 + case r == 63: // ['?','?'] + return 14 + case r == 64: // ['@','@'] + return 14 + case 65 <= r && r <= 70: // ['A','F'] + return 45 + case 71 <= r && r <= 90: // ['G','Z'] + return 14 + case r == 94: // ['^','^'] + return 14 + case r == 95: // ['_','_'] + return 51 + case 97 <= r && r <= 102: // ['a','f'] + return 45 + case 103 <= r && r <= 122: // ['g','z'] + return 14 + case r == 126: // ['~','~'] + return 14 } return NoState }, diff --git a/schema/main.go b/schema/main.go index 9fa82e3..79baf59 100644 --- a/schema/main.go +++ b/schema/main.go @@ -1,2 +1,2 @@ -//go:generate gocc azschema.bnf +//go:generate gocc -a azschema.bnf package schema diff --git a/schema/parser/action.go b/schema/parser/action.go new file mode 100644 index 0000000..54bc55e --- /dev/null +++ b/schema/parser/action.go @@ -0,0 +1,51 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import ( + "fmt" +) + +type action interface { + act() + String() string +} + +type ( + accept bool + shift int // value is next state index + reduce int // value is production index +) + +func (this accept) act() {} +func (this shift) act() {} +func (this reduce) act() {} + +func (this accept) Equal(that action) bool { + if _, ok := that.(accept); ok { + return true + } + return false +} + +func (this reduce) Equal(that action) bool { + that1, ok := that.(reduce) + if !ok { + return false + } + return this == that1 +} + +func (this shift) Equal(that action) bool { + that1, ok := that.(shift) + if !ok { + return false + } + return this == that1 +} + +func (this accept) String() string { return "accept(0)" } +func (this shift) String() string { return fmt.Sprintf("shift:%d", this) } +func (this reduce) String() string { + return fmt.Sprintf("reduce:%d(%s)", this, productionsTable[this].String) +} diff --git a/schema/parser/actiontable.go b/schema/parser/actiontable.go new file mode 100644 index 0000000..e2b5352 --- /dev/null +++ b/schema/parser/actiontable.go @@ -0,0 +1,599 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +type ( + actionTable [numStates]actionRow + actionRow struct { + canRecover bool + actions [numSymbols]action + } +) + +var actionTab = actionTable{ + actionRow{ // S0 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + shift(4), // ( + nil, // ) + nil, // . + }, + }, + actionRow{ // S1 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + accept(true), // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + nil, // ) + nil, // . + }, + }, + actionRow{ // S2 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(1), // ␚, reduce: Schema + nil, // string + nil, // number + nil, // name + shift(4), // ( + nil, // ) + nil, // . + }, + }, + actionRow{ // S3 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(2), // ␚, reduce: ExprList + nil, // string + nil, // number + nil, // name + reduce(2), // (, reduce: ExprList + nil, // ) + nil, // . + }, + }, + actionRow{ // S4 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + shift(6), // name + nil, // ( + nil, // ) + shift(7), // . + }, + }, + actionRow{ // S5 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(3), // ␚, reduce: ExprList + nil, // string + nil, // number + nil, // name + reduce(3), // (, reduce: ExprList + nil, // ) + nil, // . + }, + }, + actionRow{ // S6 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + shift(14), // ) + nil, // . + }, + }, + actionRow{ // S7 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + nil, // ) + nil, // . + }, + }, + actionRow{ // S8 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(9), // string, reduce: Val + reduce(9), // number, reduce: Val + reduce(9), // name, reduce: Val + reduce(9), // (, reduce: Val + reduce(9), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S9 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(19), // string + shift(20), // number + shift(21), // name + shift(22), // ( + shift(23), // ) + nil, // . + }, + }, + actionRow{ // S10 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(6), // string, reduce: Val + reduce(6), // number, reduce: Val + reduce(6), // name, reduce: Val + reduce(6), // (, reduce: Val + reduce(6), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S11 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(7), // string, reduce: Val + reduce(7), // number, reduce: Val + reduce(7), // name, reduce: Val + reduce(7), // (, reduce: Val + reduce(7), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S12 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(8), // string, reduce: Val + reduce(8), // number, reduce: Val + reduce(8), // name, reduce: Val + reduce(8), // (, reduce: Val + reduce(8), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S13 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + shift(24), // name + nil, // ( + nil, // ) + shift(25), // . + }, + }, + actionRow{ // S14 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(12), // ␚, reduce: Expr + nil, // string + nil, // number + nil, // name + reduce(12), // (, reduce: Expr + nil, // ) + nil, // . + }, + }, + actionRow{ // S15 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + shift(27), // ) + nil, // . + }, + }, + actionRow{ // S16 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(4), // string, reduce: ValList + reduce(4), // number, reduce: ValList + reduce(4), // name, reduce: ValList + reduce(4), // (, reduce: ValList + reduce(4), // ), reduce: ValList + nil, // . + }, + }, + actionRow{ // S17 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(9), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S18 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + shift(28), // ) + nil, // . + }, + }, + actionRow{ // S19 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(6), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S20 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(7), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S21 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(8), // ), reduce: Val + nil, // . + }, + }, + actionRow{ // S22 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + shift(29), // name + nil, // ( + nil, // ) + shift(30), // . + }, + }, + actionRow{ // S23 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(11), // ␚, reduce: Expr + nil, // string + nil, // number + nil, // name + reduce(11), // (, reduce: Expr + nil, // ) + nil, // . + }, + }, + actionRow{ // S24 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + shift(32), // ) + nil, // . + }, + }, + actionRow{ // S25 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + nil, // ) + nil, // . + }, + }, + actionRow{ // S26 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(5), // string, reduce: ValList + reduce(5), // number, reduce: ValList + reduce(5), // name, reduce: ValList + reduce(5), // (, reduce: ValList + reduce(5), // ), reduce: ValList + nil, // . + }, + }, + actionRow{ // S27 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(13), // ␚, reduce: Expr + nil, // string + nil, // number + nil, // name + reduce(13), // (, reduce: Expr + nil, // ) + nil, // . + }, + }, + actionRow{ // S28 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + reduce(10), // ␚, reduce: Expr + nil, // string + nil, // number + nil, // name + reduce(10), // (, reduce: Expr + nil, // ) + nil, // . + }, + }, + actionRow{ // S29 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + shift(35), // ) + nil, // . + }, + }, + actionRow{ // S30 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + nil, // ) + nil, // . + }, + }, + actionRow{ // S31 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(19), // string + shift(20), // number + shift(21), // name + shift(22), // ( + shift(38), // ) + nil, // . + }, + }, + actionRow{ // S32 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(12), // string, reduce: Expr + reduce(12), // number, reduce: Expr + reduce(12), // name, reduce: Expr + reduce(12), // (, reduce: Expr + reduce(12), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S33 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + shift(39), // ) + nil, // . + }, + }, + actionRow{ // S34 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(19), // string + shift(20), // number + shift(21), // name + shift(22), // ( + shift(41), // ) + nil, // . + }, + }, + actionRow{ // S35 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(12), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S36 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + shift(10), // string + shift(11), // number + shift(12), // name + shift(13), // ( + shift(42), // ) + nil, // . + }, + }, + actionRow{ // S37 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + shift(43), // ) + nil, // . + }, + }, + actionRow{ // S38 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(11), // string, reduce: Expr + reduce(11), // number, reduce: Expr + reduce(11), // name, reduce: Expr + reduce(11), // (, reduce: Expr + reduce(11), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S39 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(13), // string, reduce: Expr + reduce(13), // number, reduce: Expr + reduce(13), // name, reduce: Expr + reduce(13), // (, reduce: Expr + reduce(13), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S40 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + shift(44), // ) + nil, // . + }, + }, + actionRow{ // S41 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(11), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S42 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(13), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S43 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + reduce(10), // string, reduce: Expr + reduce(10), // number, reduce: Expr + reduce(10), // name, reduce: Expr + reduce(10), // (, reduce: Expr + reduce(10), // ), reduce: Expr + nil, // . + }, + }, + actionRow{ // S44 + canRecover: false, + actions: [numSymbols]action{ + nil, // INVALID + nil, // ␚ + nil, // string + nil, // number + nil, // name + nil, // ( + reduce(10), // ), reduce: Expr + nil, // . + }, + }, +} diff --git a/schema/parser/context.go b/schema/parser/context.go new file mode 100644 index 0000000..3ed954a --- /dev/null +++ b/schema/parser/context.go @@ -0,0 +1,7 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +// Parser-specific user-defined and entirely-optional context, +// accessible as '$Context' in SDT actions. +type Context interface{} diff --git a/schema/parser/gototable.go b/schema/parser/gototable.go new file mode 100644 index 0000000..b0649d8 --- /dev/null +++ b/schema/parser/gototable.go @@ -0,0 +1,373 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +const numNTSymbols = 6 + +type ( + gotoTable [numStates]gotoRow + gotoRow [numNTSymbols]int +) + +var gotoTab = gotoTable{ + gotoRow{ // S0 + -1, // S' + 1, // Schema + 2, // ExprList + -1, // ValList + -1, // Val + 3, // Expr + }, + gotoRow{ // S1 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S2 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + 5, // Expr + }, + gotoRow{ // S3 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S4 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S5 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S6 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 9, // Val + 8, // Expr + }, + gotoRow{ // S7 + -1, // S' + -1, // Schema + -1, // ExprList + 15, // ValList + 16, // Val + 8, // Expr + }, + gotoRow{ // S8 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S9 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 18, // Val + 17, // Expr + }, + gotoRow{ // S10 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S11 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S12 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S13 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S14 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S15 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 26, // Val + 8, // Expr + }, + gotoRow{ // S16 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S17 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S18 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S19 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S20 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S21 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S22 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S23 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S24 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 31, // Val + 8, // Expr + }, + gotoRow{ // S25 + -1, // S' + -1, // Schema + -1, // ExprList + 33, // ValList + 16, // Val + 8, // Expr + }, + gotoRow{ // S26 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S27 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S28 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S29 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 34, // Val + 8, // Expr + }, + gotoRow{ // S30 + -1, // S' + -1, // Schema + -1, // ExprList + 36, // ValList + 16, // Val + 8, // Expr + }, + gotoRow{ // S31 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 37, // Val + 17, // Expr + }, + gotoRow{ // S32 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S33 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 26, // Val + 8, // Expr + }, + gotoRow{ // S34 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 40, // Val + 17, // Expr + }, + gotoRow{ // S35 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S36 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + 26, // Val + 8, // Expr + }, + gotoRow{ // S37 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S38 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S39 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S40 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S41 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S42 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S43 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, + gotoRow{ // S44 + -1, // S' + -1, // Schema + -1, // ExprList + -1, // ValList + -1, // Val + -1, // Expr + }, +} diff --git a/schema/parser/parser.go b/schema/parser/parser.go new file mode 100644 index 0000000..56b160c --- /dev/null +++ b/schema/parser/parser.go @@ -0,0 +1,217 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +import ( + "fmt" + "strings" + + parseError "azalea/schema/errors" + "azalea/schema/token" +) + +const ( + numProductions = 14 + numStates = 45 + numSymbols = 14 +) + +// Stack + +type stack struct { + state []int + attrib []Attrib +} + +const iNITIAL_STACK_SIZE = 100 + +func newStack() *stack { + return &stack{ + state: make([]int, 0, iNITIAL_STACK_SIZE), + attrib: make([]Attrib, 0, iNITIAL_STACK_SIZE), + } +} + +func (s *stack) reset() { + s.state = s.state[:0] + s.attrib = s.attrib[:0] +} + +func (s *stack) push(state int, a Attrib) { + s.state = append(s.state, state) + s.attrib = append(s.attrib, a) +} + +func (s *stack) top() int { + return s.state[len(s.state)-1] +} + +func (s *stack) peek(pos int) int { + return s.state[pos] +} + +func (s *stack) topIndex() int { + return len(s.state) - 1 +} + +func (s *stack) popN(items int) []Attrib { + lo, hi := len(s.state)-items, len(s.state) + + attrib := s.attrib[lo:hi] + + s.state = s.state[:lo] + s.attrib = s.attrib[:lo] + + return attrib +} + +func (s *stack) String() string { + w := new(strings.Builder) + fmt.Fprintf(w, "stack:\n") + for i, st := range s.state { + fmt.Fprintf(w, "\t%d: %d , ", i, st) + if s.attrib[i] == nil { + fmt.Fprintf(w, "nil") + } else { + switch attr := s.attrib[i].(type) { + case *token.Token: + fmt.Fprintf(w, "%s", attr.Lit) + default: + fmt.Fprintf(w, "%v", attr) + } + } + fmt.Fprintf(w, "\n") + } + return w.String() +} + +// Parser + +type Parser struct { + stack *stack + nextToken *token.Token + pos int + Context Context +} + +type Scanner interface { + Scan() (tok *token.Token) +} + +func NewParser() *Parser { + p := &Parser{stack: newStack()} + p.Reset() + return p +} + +func (p *Parser) Reset() { + p.stack.reset() + p.stack.push(0, nil) +} + +func (p *Parser) Error(err error, scanner Scanner) (recovered bool, errorAttrib *parseError.Error) { + errorAttrib = &parseError.Error{ + Err: err, + ErrorToken: p.nextToken, + ErrorSymbols: p.popNonRecoveryStates(), + ExpectedTokens: make([]string, 0, 8), + } + for t, action := range actionTab[p.stack.top()].actions { + if action != nil { + errorAttrib.ExpectedTokens = append(errorAttrib.ExpectedTokens, token.TokMap.Id(token.Type(t))) + } + } + + if action := actionTab[p.stack.top()].actions[token.TokMap.Type("error")]; action != nil { + p.stack.push(int(action.(shift)), errorAttrib) // action can only be shift + } else { + return + } + + if action := actionTab[p.stack.top()].actions[p.nextToken.Type]; action != nil { + recovered = true + } + for !recovered && p.nextToken.Type != token.EOF { + p.nextToken = scanner.Scan() + if action := actionTab[p.stack.top()].actions[p.nextToken.Type]; action != nil { + recovered = true + } + } + + return +} + +func (p *Parser) popNonRecoveryStates() (removedAttribs []parseError.ErrorSymbol) { + if rs, ok := p.firstRecoveryState(); ok { + errorSymbols := p.stack.popN(p.stack.topIndex() - rs) + removedAttribs = make([]parseError.ErrorSymbol, len(errorSymbols)) + for i, e := range errorSymbols { + removedAttribs[i] = e + } + } else { + removedAttribs = []parseError.ErrorSymbol{} + } + return +} + +// recoveryState points to the highest state on the stack, which can recover +func (p *Parser) firstRecoveryState() (recoveryState int, canRecover bool) { + recoveryState, canRecover = p.stack.topIndex(), actionTab[p.stack.top()].canRecover + for recoveryState > 0 && !canRecover { + recoveryState-- + canRecover = actionTab[p.stack.peek(recoveryState)].canRecover + } + return +} + +func (p *Parser) newError(err error) error { + e := &parseError.Error{ + Err: err, + StackTop: p.stack.top(), + ErrorToken: p.nextToken, + } + actRow := actionTab[p.stack.top()] + for i, t := range actRow.actions { + if t != nil { + e.ExpectedTokens = append(e.ExpectedTokens, token.TokMap.Id(token.Type(i))) + } + } + return e +} + +func (p *Parser) Parse(scanner Scanner) (res interface{}, err error) { + p.Reset() + p.nextToken = scanner.Scan() + for acc := false; !acc; { + action := actionTab[p.stack.top()].actions[p.nextToken.Type] + if action == nil { + if recovered, errAttrib := p.Error(nil, scanner); !recovered { + p.nextToken = errAttrib.ErrorToken + return nil, p.newError(nil) + } + if action = actionTab[p.stack.top()].actions[p.nextToken.Type]; action == nil { + panic("Error recovery led to invalid action") + } + } + + switch act := action.(type) { + case accept: + res = p.stack.popN(1)[0] + acc = true + case shift: + p.stack.push(int(act), p.nextToken) + p.nextToken = scanner.Scan() + case reduce: + prod := productionsTable[int(act)] + attrib, err := prod.ReduceFunc(p.stack.popN(prod.NumSymbols), p.Context) + if err != nil { + return nil, p.newError(err) + } else { + p.stack.push(gotoTab[p.stack.top()][prod.NTType], attrib) + } + default: + panic("unknown action: " + action.String()) + } + } + return res, nil +} diff --git a/schema/parser/productionstable.go b/schema/parser/productionstable.go new file mode 100644 index 0000000..710f808 --- /dev/null +++ b/schema/parser/productionstable.go @@ -0,0 +1,160 @@ +// Code generated by gocc; DO NOT EDIT. + +package parser + +type ( + ProdTab [numProductions]ProdTabEntry + ProdTabEntry struct { + String string + Id string + NTType int + Index int + NumSymbols int + ReduceFunc func([]Attrib, interface{}) (Attrib, error) + } + Attrib interface { + } +) + +var productionsTable = ProdTab{ + ProdTabEntry{ + String: `S' : Schema << >>`, + Id: "S'", + NTType: 0, + Index: 0, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Schema : ExprList << >>`, + Id: "Schema", + NTType: 1, + Index: 1, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `ExprList : Expr << >>`, + Id: "ExprList", + NTType: 2, + Index: 2, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `ExprList : ExprList Expr << >>`, + Id: "ExprList", + NTType: 2, + Index: 3, + NumSymbols: 2, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `ValList : Val << >>`, + Id: "ValList", + NTType: 3, + Index: 4, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `ValList : ValList Val << >>`, + Id: "ValList", + NTType: 3, + Index: 5, + NumSymbols: 2, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Val : string << >>`, + Id: "Val", + NTType: 4, + Index: 6, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Val : number << >>`, + Id: "Val", + NTType: 4, + Index: 7, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Val : name << >>`, + Id: "Val", + NTType: 4, + Index: 8, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Val : Expr << >>`, + Id: "Val", + NTType: 4, + Index: 9, + NumSymbols: 1, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Expr : "(" name Val Val ")" << >>`, + Id: "Expr", + NTType: 5, + Index: 10, + NumSymbols: 5, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Expr : "(" name Val ")" << >>`, + Id: "Expr", + NTType: 5, + Index: 11, + NumSymbols: 4, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Expr : "(" name ")" << >>`, + Id: "Expr", + NTType: 5, + Index: 12, + NumSymbols: 3, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Expr : "(" "." ValList ")" << >>`, + Id: "Expr", + NTType: 5, + Index: 13, + NumSymbols: 4, + ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) { + return X[0], nil + }, + }, +} diff --git a/schema/token/token.go b/schema/token/token.go index 6cbd726..60db0fa 100644 --- a/schema/token/token.go +++ b/schema/token/token.go @@ -138,16 +138,22 @@ var TokMap = TokenMap{ typeMap: []string{ "INVALID", "␚", - "name", - "number", "string", + "number", + "name", + "(", + ")", + ".", }, idMap: map[string]Type{ "INVALID": 0, "␚": 1, - "name": 2, + "string": 2, "number": 3, - "string": 4, + "name": 4, + "(": 5, + ")": 6, + ".": 7, }, }