1
0

automatic fail pass for alias definitions

This commit is contained in:
Arpad Ryszka 2026-06-06 04:50:27 +02:00
parent b37a988b8f
commit 925fe3ce33
13 changed files with 183 additions and 153 deletions

View File

@ -191,11 +191,22 @@ func defineExpression(s *Syntax, name string, ct CommitType, expression Node) er
return err
}
func commitTypeUserDefined(ct CommitType) CommitType {
ct |= userDefined
if ct&Alias > 0 {
ct |= FailPass
}
return ct
}
func addDefinition(s *Syntax, n Node) error {
ct := flagsToCommitType(n.Nodes[1 : len(n.Nodes)-1])
ct = commitTypeUserDefined(ct)
return defineExpression(
s,
n.Nodes[0].Text(),
flagsToCommitType(n.Nodes[1:len(n.Nodes)-1])|userDefined,
ct,
n.Nodes[len(n.Nodes)-1],
)
}

View File

@ -587,10 +587,10 @@ func initAndParse(content io.Reader) (*treerack.Node, error) {
s := &treerack.Syntax{}
// whitespace:
s.Class("whitespace-chars", treerack.Alias, false, []rune{' ', '\t', '\r\, '\n'}, nil)
s.Class("whitespace-chars", treerack.Alias, false, []rune{' ', '\t', '\r', '\n'}, nil)
s.Choice("whitespace", treerack.Whitespace, "whitespace-chars")
s.Class("digit", treerack.Alias, false, nil, [][]rune{'0', '9'})
s.Class("digit", treerack.Alias, false, nil, [][]rune{{'0', '9'}})
s.Sequence("number", treerack.NoWhitespace, treerack.SequenceItem{Name: "digit", Min: 1})
s.Class("operator", treerack.None, false, []rune{'+', '-'}, nil)
s.Sequence(

View File

@ -257,45 +257,6 @@ func TestErrorMessage(t *testing.T) {
}
}
func TestErrorVerbose(t *testing.T) {
t.Skip()
// const expected = `<input>:5:2:parse failed, parsing: string
//
// "c":3,
// }<<<
//
// Parsing error on line: 5, column: 2, while parsing: string. Definition:
//
// string:nows = "\"" ([^\\"\b\f\n\r\t] | "\\" (["\\/bfnrt] | "u" [0-9a-f]{4}))* "\"";
// `
//
// const doc = `{
// "a":1,
// "b":2,
// "c":3,
// }`
//
// s, err := openSyntaxFile("example/json.treerack")
// if err != nil {
// t.Error(err)
// return
// }
//
// _, err = s.Parse(bytes.NewBufferString(doc))
// perr, ok := err.(*ParseError)
// if !ok {
// t.Error("failed to return parse error")
// return
// }
//
// if perr.Verbose() != expected {
// t.Error("failed to get the right error message")
// t.Log("got: ", perr.Verbose())
// t.Log("expected:", expected)
// }
}
func TestLongestFail(t *testing.T) {
const syntax = `
whitespace:ws = [ \t];
@ -323,32 +284,57 @@ func TestLongestFail(t *testing.T) {
}
func TestFailPass(t *testing.T) {
const syntax = `
space:ws = " ";
symbol:nows = [a-z]+;
list-separator:failpass = ",";
argument-list:failpass = (symbol (list-separator+ symbol)*);
function-application = symbol "(" argument-list? ")";
`
t.Run("basic", func(t *testing.T) {
const syntax = `
space:ws = " ";
symbol:nows = [a-z]+;
list-separator:failpass = ",";
argument-list:failpass = (symbol (list-separator+ symbol)*);
function-application = symbol "(" argument-list? ")";
`
const doc = `f(a b c)`
const doc = `f(a b c)`
testParseError(t, syntax, []errorTestItem{{
title: "fail in outer definition",
doc: doc,
perr: ParseError{
Offset: 4,
Line: 0,
Column: 4,
Definition: "function-application",
},
}})
}
testParseError(t, syntax, []errorTestItem{{
title: "fail in outer definition",
doc: doc,
perr: ParseError{
Offset: 4,
Line: 0,
Column: 4,
Definition: "function-application",
},
}})
})
func TestFailPassRoot(t *testing.T) {
const syntax = `foo:failpass = "foo"`
_, err := openSyntaxString(syntax)
if err == nil {
t.Error("failed to fail")
}
t.Run("root", func(t *testing.T) {
const syntax = `foo:failpass = "foo"`
_, err := openSyntaxString(syntax)
if err == nil {
t.Error("failed to fail")
}
})
t.Run("default alias", func(t *testing.T) {
const syntax = `
space:ws = " ";
symbol:nows = [a-z]+;
list-separator:alias = ",";
argument-list:failpass = (symbol (list-separator+ symbol)*);
function-application = symbol "(" argument-list? ")";
`
const doc = `f(a b c)`
testParseError(t, syntax, []errorTestItem{{
title: "fail in outer definition",
doc: doc,
perr: ParseError{
Offset: 4,
Line: 0,
Column: 4,
Definition: "function-application",
},
}})
})
}

View File

@ -686,6 +686,10 @@ func formatDefinitions(out io.Writer, s *Syntax) error {
defName := def.nodeName()
ct := def.commitType()
ct &^= userDefined
if ct&Alias > 0 {
ct &^= FailPass
}
if sq, ok := def.(*sequenceDefinition); ok && sq.isCharSequence(s.registry) {
ct &^= NoWhitespace
}

View File

@ -601,3 +601,36 @@ func TestDocFormat(t *testing.T) {
})
}
}
func TestInProcessSyntaxFormat(t *testing.T) {
s := &Syntax{}
s.Class("whitespace-chars", Alias, false, []rune{' ', '\t', '\r', '\n'}, nil)
s.Choice("whitespace", Whitespace, "whitespace-chars")
s.Class("digit", Alias, false, nil, [][]rune{{'0', '9'}})
s.Sequence("number", NoWhitespace, SequenceItem{Name: "digit", Min: 1})
s.Class("operator", None, false, []rune{'+', '-'}, nil)
s.Sequence(
"expression",
Root,
SequenceItem{Name: "number"},
SequenceItem{Name: "operator"},
SequenceItem{Name: "number"},
)
var out bytes.Buffer
if err := s.Format(&out); err != nil {
t.Fatal(err)
}
const expect = `whitespace-chars:alias = [ \t\r\n];
whitespace:ws = whitespace-chars;
digit:alias = [0-9];
number:nows = digit+;
operator = [+\-];
expression:root = number operator number;
`
if out.String() != expect {
t.Fatal(out.String())
}
}

4
head.gen.go Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
headexported.gen.go Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -124,10 +124,9 @@ func (p *sequenceParser) parse(c *context) {
c.results.markPending(c.offset, p.id)
}
var (
currentCount int
parsed bool
currentCount, itemIndex int
parsed bool
)
itemIndex := 0
from := c.offset
to := c.offset
for itemIndex < len(p.items) {
@ -824,12 +823,12 @@ func Parse(r io.Reader) (Node, error) {
var p172 = sequenceParser{id: 172, commit: 128, ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}}
var p170 = choiceParser{id: 170, commit: 2}
var p169 = choiceParser{id: 169, commit: 262, name: "wsc", generalizations: []int{170}}
var p2 = sequenceParser{id: 2, commit: 258, name: "wschar", allChars: true, ranges: [][]int{{1, 1}}, generalizations: []int{169, 170}}
var p2 = sequenceParser{id: 2, commit: 322, name: "wschar", allChars: true, ranges: [][]int{{1, 1}}, generalizations: []int{169, 170}}
var p1 = charParser{id: 1, chars: []rune{32, 9, 10, 8, 12, 13, 11}}
p2.items = []parser{&p1}
var p30 = sequenceParser{id: 30, commit: 264, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{169, 170}}
var p26 = choiceParser{id: 26, commit: 266, name: "comment-segment"}
var p25 = sequenceParser{id: 25, commit: 266, name: "line-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{26}}
var p26 = choiceParser{id: 26, commit: 330, name: "comment-segment"}
var p25 = sequenceParser{id: 25, commit: 330, name: "line-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{26}}
var p22 = sequenceParser{id: 22, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}}
var p20 = charParser{id: 20, chars: []rune{47}}
var p21 = charParser{id: 21, chars: []rune{47}}
@ -838,7 +837,7 @@ func Parse(r io.Reader) (Node, error) {
var p23 = charParser{id: 23, not: true, chars: []rune{10}}
p24.items = []parser{&p23}
p25.items = []parser{&p22, &p24}
var p19 = sequenceParser{id: 19, commit: 266, name: "block-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{26}}
var p19 = sequenceParser{id: 19, commit: 330, name: "block-comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{26}}
var p7 = sequenceParser{id: 7, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}}
var p5 = charParser{id: 5, chars: []rune{47}}
var p6 = charParser{id: 6, chars: []rune{42}}
@ -863,7 +862,7 @@ func Parse(r io.Reader) (Node, error) {
p19.items = []parser{&p7, &p15, &p18}
p26.options = []parser{&p25, &p19}
var p29 = sequenceParser{id: 29, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}}
var p4 = sequenceParser{id: 4, commit: 266, name: "ws-no-nl", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p4 = sequenceParser{id: 4, commit: 330, name: "ws-no-nl", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p3 = charParser{id: 3, chars: []rune{32, 9, 8, 12, 13, 11}}
p4.items = []parser{&p3}
var p28 = sequenceParser{id: 28, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
@ -881,9 +880,9 @@ func Parse(r io.Reader) (Node, error) {
var p165 = sequenceParser{id: 165, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}}
p165.items = []parser{&p170, &p162}
p166.items = []parser{&p162, &p165}
var p160 = sequenceParser{id: 160, commit: 258, name: "definitions", ranges: [][]int{{1, 1}, {0, 1}}}
var p160 = sequenceParser{id: 160, commit: 322, name: "definitions", ranges: [][]int{{1, 1}, {0, 1}}}
var p153 = sequenceParser{id: 153, commit: 256, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}}
var p150 = sequenceParser{id: 150, commit: 266, name: "definition-name", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}}
var p150 = sequenceParser{id: 150, commit: 330, name: "definition-name", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}}
var p68 = sequenceParser{id: 68, commit: 264, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}, generalizations: []int{74, 100, 104}}
var p67 = sequenceParser{id: 67, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p66 = charParser{id: 66, not: true, chars: []rune{92, 32, 10, 9, 8, 12, 13, 11, 47, 46, 91, 93, 34, 123, 125, 94, 43, 42, 63, 124, 40, 41, 58, 61, 59}}
@ -893,7 +892,7 @@ func Parse(r io.Reader) (Node, error) {
var p148 = sequenceParser{id: 148, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p147 = charParser{id: 147, chars: []rune{58}}
p148.items = []parser{&p147}
var p146 = choiceParser{id: 146, commit: 258, name: "flag"}
var p146 = choiceParser{id: 146, commit: 322, name: "flag"}
var p115 = sequenceParser{id: 115, commit: 264, name: "alias", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{146}}
var p110 = charParser{id: 110, chars: []rune{97}}
var p111 = charParser{id: 111, chars: []rune{108}}
@ -943,8 +942,8 @@ func Parse(r io.Reader) (Node, error) {
var p152 = sequenceParser{id: 152, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p151 = charParser{id: 151, chars: []rune{61}}
p152.items = []parser{&p151}
var p74 = choiceParser{id: 74, commit: 258, name: "expression"}
var p65 = choiceParser{id: 65, commit: 258, name: "terminal", generalizations: []int{74, 100, 104}}
var p74 = choiceParser{id: 74, commit: 322, name: "expression"}
var p65 = choiceParser{id: 65, commit: 322, name: "terminal", generalizations: []int{74, 100, 104}}
var p32 = sequenceParser{id: 32, commit: 264, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{65, 74, 100, 104}}
var p31 = charParser{id: 31, chars: []rune{46}}
p32.items = []parser{&p31}
@ -1001,7 +1000,7 @@ func Parse(r io.Reader) (Node, error) {
p63.items = []parser{&p62}
p64.items = []parser{&p61, &p59, &p63}
p65.options = []parser{&p32, &p51, &p64}
var p73 = sequenceParser{id: 73, commit: 258, name: "group", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{74, 100, 104}}
var p73 = sequenceParser{id: 73, commit: 322, name: "group", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{74, 100, 104}}
var p70 = sequenceParser{id: 70, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p69 = charParser{id: 69, chars: []rune{40}}
p70.items = []parser{&p69}
@ -1013,13 +1012,13 @@ func Parse(r io.Reader) (Node, error) {
var p101 = sequenceParser{id: 101, commit: 264, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}}
var p100 = choiceParser{id: 100, commit: 10}
p100.options = []parser{&p65, &p68, &p73}
var p99 = choiceParser{id: 99, commit: 258, name: "quantity"}
var p99 = choiceParser{id: 99, commit: 322, name: "quantity"}
var p83 = sequenceParser{id: 83, commit: 256, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{99}}
var p80 = sequenceParser{id: 80, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p79 = charParser{id: 79, chars: []rune{123}}
p80.items = []parser{&p79}
var p78 = sequenceParser{id: 78, commit: 256, name: "count", ranges: [][]int{{1, 1}}}
var p77 = sequenceParser{id: 77, commit: 266, name: "number", ranges: [][]int{{1, -1}, {1, -1}}}
var p77 = sequenceParser{id: 77, commit: 330, name: "number", ranges: [][]int{{1, -1}, {1, -1}}}
var p76 = sequenceParser{id: 76, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var p75 = charParser{id: 75, ranges: [][]rune{{48, 57}}}
p76.items = []parser{&p75}
@ -1059,7 +1058,7 @@ func Parse(r io.Reader) (Node, error) {
p102.items = []parser{&p170, &p101}
p103.items = []parser{&p101, &p102}
var p109 = sequenceParser{id: 109, commit: 256, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{74}}
var p104 = choiceParser{id: 104, commit: 258, name: "option"}
var p104 = choiceParser{id: 104, commit: 322, name: "option"}
p104.options = []parser{&p65, &p68, &p73, &p103}
var p107 = sequenceParser{id: 107, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}}
var p106 = sequenceParser{id: 106, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
@ -1095,12 +1094,12 @@ func Parse(r io.Reader) (Node, error) {
var b172 = sequenceBuilder{id: 172, commit: 128, name: "syntax", ranges: [][]int{{0, -1}, {1, 1}, {0, -1}}}
var b170 = choiceBuilder{id: 170, commit: 2}
var b169 = choiceBuilder{id: 169, commit: 262, generalizations: []int{170}}
var b2 = sequenceBuilder{id: 2, commit: 258, allChars: true, ranges: [][]int{{1, 1}}, generalizations: []int{169, 170}}
var b2 = sequenceBuilder{id: 2, commit: 322, allChars: true, ranges: [][]int{{1, 1}}, generalizations: []int{169, 170}}
var b1 = charBuilder{}
b2.items = []builder{&b1}
var b30 = sequenceBuilder{id: 30, commit: 264, name: "comment", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{169, 170}}
var b26 = choiceBuilder{id: 26, commit: 266}
var b25 = sequenceBuilder{id: 25, commit: 266, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{26}}
var b26 = choiceBuilder{id: 26, commit: 330}
var b25 = sequenceBuilder{id: 25, commit: 330, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{26}}
var b22 = sequenceBuilder{id: 22, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}}
var b20 = charBuilder{}
var b21 = charBuilder{}
@ -1109,7 +1108,7 @@ func Parse(r io.Reader) (Node, error) {
var b23 = charBuilder{}
b24.items = []builder{&b23}
b25.items = []builder{&b22, &b24}
var b19 = sequenceBuilder{id: 19, commit: 266, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{26}}
var b19 = sequenceBuilder{id: 19, commit: 330, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{26}}
var b7 = sequenceBuilder{id: 7, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}}}
var b5 = charBuilder{}
var b6 = charBuilder{}
@ -1134,7 +1133,7 @@ func Parse(r io.Reader) (Node, error) {
b19.items = []builder{&b7, &b15, &b18}
b26.options = []builder{&b25, &b19}
var b29 = sequenceBuilder{id: 29, commit: 10, ranges: [][]int{{0, -1}, {0, 1}, {0, -1}, {1, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 1}}}
var b4 = sequenceBuilder{id: 4, commit: 266, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b4 = sequenceBuilder{id: 4, commit: 330, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b3 = charBuilder{}
b4.items = []builder{&b3}
var b28 = sequenceBuilder{id: 28, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
@ -1152,9 +1151,9 @@ func Parse(r io.Reader) (Node, error) {
var b165 = sequenceBuilder{id: 165, commit: 2, ranges: [][]int{{0, -1}, {1, 1}}}
b165.items = []builder{&b170, &b162}
b166.items = []builder{&b162, &b165}
var b160 = sequenceBuilder{id: 160, commit: 258, ranges: [][]int{{1, 1}, {0, 1}}}
var b160 = sequenceBuilder{id: 160, commit: 322, ranges: [][]int{{1, 1}, {0, 1}}}
var b153 = sequenceBuilder{id: 153, commit: 256, name: "definition", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}}
var b150 = sequenceBuilder{id: 150, commit: 266, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}}
var b150 = sequenceBuilder{id: 150, commit: 330, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}}
var b68 = sequenceBuilder{id: 68, commit: 264, name: "symbol", ranges: [][]int{{1, -1}, {1, -1}}, generalizations: []int{74, 100, 104}}
var b67 = sequenceBuilder{id: 67, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b66 = charBuilder{}
@ -1164,7 +1163,7 @@ func Parse(r io.Reader) (Node, error) {
var b148 = sequenceBuilder{id: 148, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b147 = charBuilder{}
b148.items = []builder{&b147}
var b146 = choiceBuilder{id: 146, commit: 258}
var b146 = choiceBuilder{id: 146, commit: 322}
var b115 = sequenceBuilder{id: 115, commit: 264, name: "alias", allChars: true, ranges: [][]int{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}}, generalizations: []int{146}}
var b110 = charBuilder{}
var b111 = charBuilder{}
@ -1214,8 +1213,8 @@ func Parse(r io.Reader) (Node, error) {
var b152 = sequenceBuilder{id: 152, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b151 = charBuilder{}
b152.items = []builder{&b151}
var b74 = choiceBuilder{id: 74, commit: 258}
var b65 = choiceBuilder{id: 65, commit: 258, generalizations: []int{74, 100, 104}}
var b74 = choiceBuilder{id: 74, commit: 322}
var b65 = choiceBuilder{id: 65, commit: 322, generalizations: []int{74, 100, 104}}
var b32 = sequenceBuilder{id: 32, commit: 264, name: "any-char", allChars: true, ranges: [][]int{{1, 1}, {1, 1}}, generalizations: []int{65, 74, 100, 104}}
var b31 = charBuilder{}
b32.items = []builder{&b31}
@ -1272,7 +1271,7 @@ func Parse(r io.Reader) (Node, error) {
b63.items = []builder{&b62}
b64.items = []builder{&b61, &b59, &b63}
b65.options = []builder{&b32, &b51, &b64}
var b73 = sequenceBuilder{id: 73, commit: 258, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{74, 100, 104}}
var b73 = sequenceBuilder{id: 73, commit: 322, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{74, 100, 104}}
var b70 = sequenceBuilder{id: 70, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b69 = charBuilder{}
b70.items = []builder{&b69}
@ -1284,13 +1283,13 @@ func Parse(r io.Reader) (Node, error) {
var b101 = sequenceBuilder{id: 101, commit: 264, name: "item", ranges: [][]int{{1, 1}, {0, 1}, {1, 1}, {0, 1}}}
var b100 = choiceBuilder{id: 100, commit: 10}
b100.options = []builder{&b65, &b68, &b73}
var b99 = choiceBuilder{id: 99, commit: 258}
var b99 = choiceBuilder{id: 99, commit: 322}
var b83 = sequenceBuilder{id: 83, commit: 256, name: "count-quantifier", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}, {1, 1}}, generalizations: []int{99}}
var b80 = sequenceBuilder{id: 80, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b79 = charBuilder{}
b80.items = []builder{&b79}
var b78 = sequenceBuilder{id: 78, commit: 256, name: "count", ranges: [][]int{{1, 1}}}
var b77 = sequenceBuilder{id: 77, commit: 266, ranges: [][]int{{1, -1}, {1, -1}}}
var b77 = sequenceBuilder{id: 77, commit: 330, ranges: [][]int{{1, -1}, {1, -1}}}
var b76 = sequenceBuilder{id: 76, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}
var b75 = charBuilder{}
b76.items = []builder{&b75}
@ -1330,7 +1329,7 @@ func Parse(r io.Reader) (Node, error) {
b102.items = []builder{&b170, &b101}
b103.items = []builder{&b101, &b102}
var b109 = sequenceBuilder{id: 109, commit: 256, name: "choice", ranges: [][]int{{1, 1}, {0, -1}, {1, 1}, {0, -1}}, generalizations: []int{74}}
var b104 = choiceBuilder{id: 104, commit: 258}
var b104 = choiceBuilder{id: 104, commit: 322}
b104.options = []builder{&b65, &b68, &b73, &b103}
var b107 = sequenceBuilder{id: 107, commit: 2, ranges: [][]int{{1, 1}, {0, -1}, {1, 1}}}
var b106 = sequenceBuilder{id: 106, commit: 10, allChars: true, ranges: [][]int{{1, 1}, {1, 1}}}

View File

@ -1,11 +1,11 @@
sources = $(shell find . -name '*.go' \
| grep -v cmd/treerack/docreflect.gen.go \
| grep -v head.go \
| grep -v .build/head.go \
| grep -v headexported.go \
| grep -v .build/headexported.go \
| grep -v internal/self/self.go \
| grep -v .build/self.go)
| grep -v head.gen.go \
| grep -v .build/head.gen.go \
| grep -v headexported.gen.go \
| grep -v .build/headexported.gen.go \
| grep -v internal/self/self.gen.go \
| grep -v .build/self.gen.go)
parsers = $(shell find . -name '*.treerack' | grep -v baz_test[.]treerack)
release_date = $(shell git show -s --format=%cs HEAD)
version = $(release_date)-$(shell git rev-parse --short HEAD)
@ -17,7 +17,7 @@ default: build
.build:
mkdir -p .build
.build/head.go: $(sources) .build
.build/head.gen.go: $(sources) .build
go fmt ./...
go run script/createhead.go -- \
char.go \
@ -28,13 +28,13 @@ default: build
context.go \
nodehead.go \
syntaxhead.go \
> .build/head.go
go fmt .build/head.go
> .build/head.gen.go
go fmt .build/head.gen.go
head.go: .build/head.go
cp .build/head.go .
head.gen.go: .build/head.gen.go
cp .build/head.gen.go .
.build/headexported.go: $(sources) .build
.build/headexported.gen.go: $(sources) .build
go fmt ./...
go run script/createhead.go --exported -- \
char.go \
@ -45,32 +45,32 @@ head.go: .build/head.go
context.go \
nodehead.go \
syntaxhead.go \
> .build/headexported.go
go fmt .build/headexported.go
> .build/headexported.gen.go
go fmt .build/headexported.gen.go
headexported.go: .build/headexported.go
cp .build/headexported.go .
headexported.gen.go: .build/headexported.gen.go
cp .build/headexported.gen.go .
.build/self.go: $(sources) $(parsers) head.go headexported.go .build
.build/self.gen.go: $(sources) $(parsers) head.gen.go headexported.gen.go .build
# since the generator code depends on the syntax itself, and such influences its own output, we need two
# passes:
go build -o .build/treerack.current ./cmd/treerack
.build/treerack.current generate --export --package-name self < syntax.treerack > .build/self.go
go fmt .build/self.go
.build/treerack.current generate --export --package-name self < syntax.treerack > .build/self.gen.go
go fmt .build/self.gen.go
# we backup the original and apply the new:
cp internal/self/self.go .build/self.go.backup
cp .build/self.go internal/self
cp internal/self/self.gen.go .build/self.gen.go.backup
cp .build/self.gen.go internal/self
# second pass:
go build -o .build/treerack.interim ./cmd/treerack || mv .build/self.go.backup internal/self/self.go
.build/treerack.interim generate --export --package-name self < syntax.treerack > .build/self.go \
|| mv .build/self.go.backup internal/self/self.go
go fmt .build/self.go || mv .build/self.go.backup internal/self/self.go
mv .build/self.go.backup internal/self/self.go
go build -o .build/treerack.interim ./cmd/treerack || mv .build/self.gen.go.backup internal/self/self.gen.go
.build/treerack.interim generate --export --package-name self < syntax.treerack > .build/self.gen.go \
|| mv .build/self.gen.go.backup internal/self/self.gen.go
go fmt .build/self.gen.go || mv .build/self.gen.go.backup internal/self/self.gen.go
mv .build/self.gen.go.backup internal/self/self.gen.go
internal/self/self.go: .build/self.go
cp .build/self.go internal/self
internal/self/self.gen.go: .build/self.gen.go
cp .build/self.gen.go internal/self
lib: $(sources) head.go headexported.go internal/self/self.go
lib: $(sources) head.gen.go headexported.gen.go internal/self/self.gen.go
go build
go build ./internal/self
@ -93,17 +93,17 @@ cmd/treerack/readme.md: $(sources) cmd/treerack/docreflect.gen.go
build: lib cmd/treerack/readme.md .build/treerack .build/treerack.1
check-generate: .build/head.go .build/headexported.go .build/self.go
@if ! diff head.go .build/head.go > /dev/null; then \
echo head.go does not match; \
check-generate: .build/head.gen.go .build/headexported.gen.go .build/self.gen.go
@if ! diff head.gen.go .build/head.gen.go > /dev/null; then \
echo head.gen.go does not match; \
false; \
fi
@if ! diff headexported.go .build/headexported.go > /dev/null; then \
echo headexported.go does not match; \
@if ! diff headexported.gen.go .build/headexported.gen.go > /dev/null; then \
echo headexported.gen.go does not match; \
false; \
fi
@if ! diff internal/self/self.go .build/self.go > /dev/null; then \
echo self.go does not match; \
@if ! diff internal/self/self.gen.go .build/self.gen.go > /dev/null; then \
echo self.gen.go does not match; \
false; \
fi
@ -135,7 +135,7 @@ cpu.out: $(sources)
cpu: cpu.out
go tool pprof -top cpu.out
fmt: $(sources) $(parsers) head.go headexported.go internal/self/self.go cmd/treerack/docreflect.gen.go
fmt: $(sources) $(parsers) head.gen.go headexported.gen.go internal/self/self.gen.go cmd/treerack/docreflect.gen.go
go fmt ./...
go run script/format.go $(parsers)

View File

@ -35,14 +35,12 @@ func (p *sequenceParser) parse(c *context) {
}
var (
currentCount int
parsed bool
currentCount, itemIndex int
parsed bool
)
itemIndex := 0
from := c.offset
to := c.offset
for itemIndex < len(p.items) {
p.items[itemIndex].parse(c)
if !c.matchLast {
@ -87,7 +85,6 @@ func (p *sequenceParser) parse(c *context) {
}
to = c.offset
if !parsed || p.ranges[itemIndex][1] > 0 && currentCount == p.ranges[itemIndex][1] {
itemIndex++
currentCount = 0

View File

@ -274,7 +274,7 @@ func (s *Syntax) AnyChar(name string, ct CommitType) error {
return ErrInvalidSymbolName
}
return s.anyChar(name, ct|userDefined)
return s.anyChar(name, commitTypeUserDefined(ct))
}
func childName(name string, childIndex int) string {
@ -306,7 +306,7 @@ func (s *Syntax) Class(name string, ct CommitType, not bool, chars []rune, range
return ErrInvalidSymbolName
}
return s.class(name, ct|userDefined, not, chars, ranges)
return s.class(name, commitTypeUserDefined(ct), not, chars, ranges)
}
func (s *Syntax) charSequence(name string, ct CommitType, chars []rune) error {
@ -328,7 +328,7 @@ func (s *Syntax) CharSequence(name string, ct CommitType, chars []rune) error {
return ErrInvalidSymbolName
}
return s.charSequence(name, ct|userDefined, chars)
return s.charSequence(name, commitTypeUserDefined(ct), chars)
}
func (s *Syntax) sequence(name string, ct CommitType, items ...SequenceItem) error {
@ -341,7 +341,7 @@ func (s *Syntax) Sequence(name string, ct CommitType, items ...SequenceItem) err
return ErrInvalidSymbolName
}
return s.sequence(name, ct|userDefined, items...)
return s.sequence(name, commitTypeUserDefined(ct), items...)
}
func (s *Syntax) choice(name string, ct CommitType, options ...string) error {
@ -354,7 +354,7 @@ func (s *Syntax) Choice(name string, ct CommitType, options ...string) error {
return ErrInvalidSymbolName
}
return s.choice(name, ct|userDefined, options...)
return s.choice(name, commitTypeUserDefined(ct), options...)
}
// ReadSyntax loads a grammar definition from a reader using the Treerack syntax format.