@ for escaping keywords
							parent
							
								
									facf55cbc0
								
							
						
					
					
						commit
						c28a490c17
					
				| 
						 | 
				
			
			@ -1335,7 +1335,7 @@ fn (p mut Parser) bterm() string {
 | 
			
		|||
	return typ
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// also called on *, &, . (enum) 
 | 
			
		||||
// also called on *, &, @, . (enum) 
 | 
			
		||||
fn (p mut Parser) name_expr() string {
 | 
			
		||||
	p.log('\nname expr() pass=$p.run tok=${p.tok.str()} $p.lit')
 | 
			
		||||
	// print('known type:')
 | 
			
		||||
| 
						 | 
				
			
			@ -2167,11 +2167,8 @@ fn (p mut Parser) factor() string {
 | 
			
		|||
		p.gen('$sizeof_typ)')
 | 
			
		||||
		p.fgen('$sizeof_typ)')
 | 
			
		||||
		return 'int'
 | 
			
		||||
	case Token.amp:
 | 
			
		||||
		return p.name_expr()
 | 
			
		||||
	case Token.dot:
 | 
			
		||||
		return p.name_expr()// `.green` (enum)
 | 
			
		||||
	case Token.mul:
 | 
			
		||||
	case Token.amp, Token.dot, Token.mul: 
 | 
			
		||||
		// (dot is for enum vals: `.green`) 
 | 
			
		||||
		return p.name_expr()
 | 
			
		||||
	case Token.name:
 | 
			
		||||
		// map[string]int
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -388,6 +388,13 @@ fn (s mut Scanner) scan() ScanRes {
 | 
			
		|||
		return scan_res(.pipe, '')
 | 
			
		||||
	case `,`:
 | 
			
		||||
		return scan_res(.comma, '')
 | 
			
		||||
	case `@`:
 | 
			
		||||
		s.pos++ 
 | 
			
		||||
		name := s.ident_name()
 | 
			
		||||
		if !is_key(name) {
 | 
			
		||||
			s.error('@ must be used before keywords (e.g. `@type string`)') 
 | 
			
		||||
		} 
 | 
			
		||||
		return scan_res(.name, name)
 | 
			
		||||
	case `\r`:
 | 
			
		||||
		if nextc == `\n` {
 | 
			
		||||
			s.pos++
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,10 @@ struct User {
 | 
			
		|||
	name string
 | 
			
		||||
	age int 
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
struct Foo {
 | 
			
		||||
	@type string 
 | 
			
		||||
} 
 | 
			
		||||
 
 | 
			
		||||
fn test_struct_levels() { 
 | 
			
		||||
	mut c := C{} 
 | 
			
		||||
| 
						 | 
				
			
			@ -54,3 +58,8 @@ fn test_struct_str() {
 | 
			
		|||
	println(u)  // make sure the struct is printable 
 | 
			
		||||
	// assert u.str() == '{name:"Bob", age:30}'  // TODO 
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
fn test_at() {
 | 
			
		||||
	foo := Foo{ @type: 'test' } 
 | 
			
		||||
	println(foo.@type) 
 | 
			
		||||
} 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ enum Token {
 | 
			
		|||
	dollar
 | 
			
		||||
	left_shift
 | 
			
		||||
	righ_shift
 | 
			
		||||
	//at // @ 
 | 
			
		||||
	// = := += -=
 | 
			
		||||
	assign
 | 
			
		||||
	decl_assign
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +149,7 @@ fn build_token_str() []string {
 | 
			
		|||
	s[Token.dot] = '.'
 | 
			
		||||
	s[Token.dotdot] = '..'
 | 
			
		||||
	s[Token.comma] = ','
 | 
			
		||||
	//s[Token.at] = '@'
 | 
			
		||||
	s[Token.semicolon] = ';'
 | 
			
		||||
	s[Token.colon] = ':'
 | 
			
		||||
	s[Token.arrow] = '=>'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue