automatic fail pass for alias definitions
This commit is contained in:
parent
b37a988b8f
commit
925fe3ce33
13
define.go
13
define.go
@ -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],
|
||||
)
|
||||
}
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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,6 +284,7 @@ func TestLongestFail(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestFailPass(t *testing.T) {
|
||||
t.Run("basic", func(t *testing.T) {
|
||||
const syntax = `
|
||||
space:ws = " ";
|
||||
symbol:nows = [a-z]+;
|
||||
@ -343,12 +305,36 @@ func TestFailPass(t *testing.T) {
|
||||
Definition: "function-application",
|
||||
},
|
||||
}})
|
||||
}
|
||||
})
|
||||
|
||||
func TestFailPassRoot(t *testing.T) {
|
||||
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",
|
||||
},
|
||||
}})
|
||||
})
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
4
head.gen.go
Normal file
File diff suppressed because one or more lines are too long
4
headexported.gen.go
Normal file
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
@ -124,10 +124,9 @@ func (p *sequenceParser) parse(c *context) {
|
||||
c.results.markPending(c.offset, p.id)
|
||||
}
|
||||
var (
|
||||
currentCount int
|
||||
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}}}
|
||||
74
makefile
74
makefile
@ -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)
|
||||
|
||||
|
||||
@ -35,14 +35,12 @@ func (p *sequenceParser) parse(c *context) {
|
||||
}
|
||||
|
||||
var (
|
||||
currentCount int
|
||||
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
|
||||
|
||||
10
syntax.go
10
syntax.go
@ -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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user