Parse constant access unit specifiers
This commit is contained in:
parent
2346c34cce
commit
e12e83921b
|
@ -97,7 +97,7 @@ func (this *treeParser) parseExpressionRoot () (entity.Expression, error) {
|
|||
|
||||
switch this.Kind() {
|
||||
case lexer.Ident: return this.parseExpressionRootIdent()
|
||||
case lexer.TypeIdent: return this.parseConstant()
|
||||
case lexer.TypeIdent: return this.parseConstantCore(this.Pos(), "")
|
||||
case lexer.LParen: return this.parseExpressionRootLParen()
|
||||
case lexer.LBracket: return this.parseExpressionRootLBracket()
|
||||
case lexer.LBrace: return this.parseBlock()
|
||||
|
@ -129,11 +129,19 @@ func (this *treeParser) parseExpressionRootIdent () (entity.Expression, error) {
|
|||
// Colon: declaration
|
||||
return this.parseDeclarationCore(pos, name)
|
||||
case lexer.DoubleColon:
|
||||
// DoubleColon: call
|
||||
err := this.ExpectNext(lexer.LBracket)
|
||||
// DoubleColon: call, constant
|
||||
err := this.ExpectNext(lexer.LBracket, lexer.TypeIdent)
|
||||
if err != nil { return nil, err }
|
||||
this.Next()
|
||||
return this.parseCallCore(pos, name)
|
||||
|
||||
switch this.Kind() {
|
||||
case lexer.TypeIdent:
|
||||
// TypeIdent: constant
|
||||
return this.parseConstantCore(pos, name)
|
||||
case lexer.LBracket:
|
||||
// LBracket: call
|
||||
this.Next()
|
||||
return this.parseCallCore(pos, name)
|
||||
}
|
||||
default:
|
||||
// *: variable
|
||||
return &entity.Variable {
|
||||
|
@ -142,6 +150,7 @@ func (this *treeParser) parseExpressionRootIdent () (entity.Expression, error) {
|
|||
}, nil
|
||||
}
|
||||
}
|
||||
panic(this.bug())
|
||||
}
|
||||
|
||||
func (this *treeParser) parseExpressionRootLParen () (entity.Expression, error) {
|
||||
|
@ -719,12 +728,14 @@ func (this *treeParser) parseFor () (*entity.For, error) {
|
|||
return loop, nil
|
||||
}
|
||||
|
||||
func (this *treeParser) parseConstant () (*entity.Constant, error) {
|
||||
func (this *treeParser) parseConstantCore (pos errors.Position, unitNickname string) (*entity.Constant, error) {
|
||||
pos = pos.Union(this.Pos())
|
||||
err := this.Expect(lexer.TypeIdent)
|
||||
if err != nil { return nil, err }
|
||||
constant := &entity.Constant {
|
||||
Pos: this.Pos(),
|
||||
TypeName: this.Value(),
|
||||
Pos: this.Pos(),
|
||||
UnitNickname: unitNickname,
|
||||
TypeName: this.Value(),
|
||||
}
|
||||
|
||||
err = this.ExpectNext(lexer.Dot)
|
||||
|
|
|
@ -84,7 +84,8 @@ testString (test,
|
|||
- [for s:String] = for e:Byte in s [break e]
|
||||
- [matchToInt u:(| Int F64)]:Int = match u | u:Int u | u:F64 [~ Int u] * 0
|
||||
- [switch x:Int] = switch x | 0 5 | 1 4 | 2 3 * 0
|
||||
- [whatFile fd:FD]:String = switch fd | FD.stdin 'in' | FD.stdout 'out' * '?'`,
|
||||
- [whatFile fd:FD]:String = switch fd | FD.stdin 'in' | FD.stdout 'out' * '?'
|
||||
- [whatFile2 fd:io::FD]:String = switch fd | io::FD.stdin 'in' | io::FD.stdout 'out' * '?'`,
|
||||
// input
|
||||
`
|
||||
[var] = sdfdf
|
||||
|
|
Loading…
Reference in New Issue