Lines Matching refs:p

18 	p := &parser{s: newScanner(data, filename, errorHandler)}
21 for p.next(); p.tok != tokEOF; {
22 decl := p.parseTopRecover()
44 if !p.s.Ok() {
93 func (p *parser) parseTopRecover() Node {
99 for p.tok != tokNewLine && p.tok != tokEOF {
100 p.next()
102 p.tryConsume(tokNewLine)
107 decl := p.parseTop()
111 p.consume(tokNewLine)
115 func (p *parser) parseTop() Node {
116 switch p.tok {
118 return &NewLine{Pos: p.pos}
120 return p.parseComment()
122 return p.parseDefine()
124 return p.parseInclude()
126 return p.parseIncdir()
128 return p.parseResource()
130 name := p.parseIdent()
132 return p.parseTypeDef()
134 switch p.tok {
136 return p.parseCall(name)
138 return p.parseStruct(name)
140 return p.parseFlags(name)
142 p.expect(tokLParen, tokLBrace, tokLBrack, tokEq)
148 p.expect(tokComment, tokDefine, tokInclude, tokResource, tokIdent)
153 func (p *parser) next() {
154 p.tok, p.lit, p.pos = p.s.Scan()
157 func (p *parser) consume(tok token) {
158 p.expect(tok)
159 p.next()
162 func (p *parser) tryConsume(tok token) bool {
163 if p.tok != tok {
166 p.next()
170 func (p *parser) expect(tokens ...token) {
172 if p.tok == tok {
180 p.s.Error(p.pos, fmt.Sprintf("unexpected %v, expecting %v", p.tok, strings.Join(str, ", ")))
184 func (p *parser) parseComment() *Comment {
186 Pos: p.pos,
187 Text: p.lit,
189 p.consume(tokComment)
193 func (p *parser) parseDefine() *Define {
194 pos0 := p.pos
195 p.consume(tokDefine)
196 name := p.parseIdent()
197 p.expect(tokInt, tokIdent, tokCExpr)
199 if p.tok == tokCExpr {
200 val = p.parseCExpr()
202 val = p.parseInt()
211 func (p *parser) parseInclude() *Include {
212 pos0 := p.pos
213 p.consume(tokInclude)
216 File: p.parseString(),
220 func (p *parser) parseIncdir() *Incdir {
221 pos0 := p.pos
222 p.consume(tokIncdir)
225 Dir: p.parseString(),
229 func (p *parser) parseResource() *Resource {
230 pos0 := p.pos
231 p.consume(tokResource)
232 name := p.parseIdent()
233 p.consume(tokLBrack)
234 base := p.parseType()
235 p.consume(tokRBrack)
237 if p.tryConsume(tokColon) {
238 values = append(values, p.parseInt())
239 for p.tryConsume(tokComma) {
240 values = append(values, p.parseInt())
251 func (p *parser) parseTypeDef() *TypeDef {
252 pos0 := p.pos
253 name := p.parseIdent()
257 p.expect(tokLBrack, tokIdent)
258 if p.tryConsume(tokLBrack) {
259 args = append(args, p.parseIdent())
260 for p.tryConsume(tokComma) {
261 args = append(args, p.parseIdent())
263 p.consume(tokRBrack)
264 if p.tok == tokLBrace || p.tok == tokLBrack {
269 str = p.parseStruct(emptyName)
271 typ = p.parseType()
274 typ = p.parseType()
285 func (p *parser) parseCall(name *Ident) *Call {
291 p.consume(tokLParen)
292 for p.tok != tokRParen {
293 c.Args = append(c.Args, p.parseField())
294 p.expect(tokComma, tokRParen)
295 p.tryConsume(tokComma)
297 p.consume(tokRParen)
298 if p.tok != tokNewLine {
299 c.Ret = p.parseType()
312 func (p *parser) parseFlags(name *Ident) Node {
313 p.consume(tokEq)
314 switch p.tok {
316 return p.parseIntFlags(name)
318 return p.parseStrFlags(name)
320 p.expect(tokInt, tokIdent, tokString)
325 func (p *parser) parseIntFlags(name *Ident) *IntFlags {
326 values := []*Int{p.parseInt()}
327 for p.tryConsume(tokComma) {
328 values = append(values, p.parseInt())
337 func (p *parser) parseStrFlags(name *Ident) *StrFlags {
338 values := []*String{p.parseString()}
339 for p.tryConsume(tokComma) {
340 values = append(values, p.parseString())
349 func (p *parser) parseStruct(name *Ident) *Struct {
355 if p.tok == tokLBrack {
359 p.next()
360 p.consume(tokNewLine)
363 for p.tok == tokNewLine {
365 p.next()
367 comments := p.parseCommentBlock()
368 if p.tryConsume(closing) {
372 fld := p.parseField()
376 p.consume(tokNewLine)
378 if p.tryConsume(tokLBrack) {
379 str.Attrs = append(str.Attrs, p.parseType())
380 for p.tryConsume(tokComma) {
381 str.Attrs = append(str.Attrs, p.parseType())
383 p.consume(tokRBrack)
388 func (p *parser) parseCommentBlock() []*Comment {
390 for p.tok == tokComment {
391 comments = append(comments, p.parseComment())
392 p.consume(tokNewLine)
393 for p.tryConsume(tokNewLine) {
399 func (p *parser) parseField() *Field {
400 name := p.parseIdent()
404 Type: p.parseType(),
408 func (p *parser) parseType() *Type {
410 Pos: p.pos,
413 switch p.tok {
416 arg.Value, arg.ValueFmt = p.parseIntValue()
419 arg.Ident = p.lit
421 arg.String = p.lit
424 p.expect(tokInt, tokIdent, tokString)
426 p.next()
427 if allowColon && p.tryConsume(tokColon) {
429 arg.Pos2 = p.pos
430 switch p.tok {
432 arg.Value2, arg.Value2Fmt = p.parseIntValue()
434 arg.Ident2 = p.lit
436 p.expect(tokInt, tokIdent)
438 p.next()
440 arg.Args = p.parseTypeList()
444 func (p *parser) parseTypeList() []*Type {
446 if p.tryConsume(tokLBrack) {
447 args = append(args, p.parseType())
448 for p.tryConsume(tokComma) {
449 args = append(args, p.parseType())
451 p.consume(tokRBrack)
456 func (p *parser) parseIdent() *Ident {
457 p.expect(tokIdent)
459 Pos: p.pos,
460 Name: p.lit,
462 p.next()
466 func (p *parser) parseString() *String {
467 p.expect(tokString)
469 Pos: p.pos,
470 Value: p.lit,
472 p.next()
476 func (p *parser) parseInt() *Int {
478 Pos: p.pos,
480 switch p.tok {
482 i.Value, i.ValueFmt = p.parseIntValue()
484 i.Ident = p.lit
486 p.expect(tokInt, tokIdent)
488 p.next()
492 func (p *parser) parseIntValue() (uint64, IntFmt) {
493 if p.lit[0] == '\'' {
494 return uint64(p.lit[1]), IntFmtChar
496 if v, err := strconv.ParseUint(p.lit, 10, 64); err == nil {
499 if v, err := strconv.ParseInt(p.lit, 10, 64); err == nil {
502 if len(p.lit) > 2 && p.lit[0] == '0' && p.lit[1] == 'x' {
503 if v, err := strconv.ParseUint(p.lit[2:], 16, 64); err == nil {
507 panic(fmt.Sprintf("scanner returned bad integer %q", p.lit))
510 func (p *parser) parseCExpr() *Int {
512 Pos: p.pos,
513 CExpr: p.lit,
515 p.consume(tokCExpr)