20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/xmk/lexer.rb', line 20
def scan
while (c = self.advance) != nil
@start = @current
case c
when "#"
self.end_line
when "+"
if self.peek == "="
@assignment_type = "append"
@tokens.push(Token.new(Token::ADD, '+=', @line))
self.advance(2)
self.get_value(Token::VAL)
end
when "="
@assignment_type = "assign"
@tokens.push(Token.new(Token::SET, '=', @line))
self.advance
self.get_value(Token::VAL)
when "@"
loop do
c = self.advance
c = self.handle_comment_backslash(c)
break if self.terminates?(c)
end
@tokens.push(Token.new(Token::TAR, @string[@start+1 .. @current].strip,
@line))
when "$"
self.get_value(Token::CMD)
when "_"
self.handle_label
else
if self.terminates?(c)
@in_label = false
@tokens.push(Token.new(Token::LBR, c, @line))
elsif c.match?(/[A-Z]/)
loop do
self.advance
break unless self.peek.match?(/[A-Z_]/)
end
@tokens.push(Token.new(
Token::VAR, @string[@start .. @current].strip, @line))
elsif c.match?(/[a-z]/)
if @in_label
self.get_value(Token::CMD)
else
if self.find("@")
loop do
self.advance
break if self.peek == ":"
end
@tokens.push(Token.new(Token::PLAT, @string[@start .. @current],
@line))
parse_target = false
loop do
c = self.advance
if c == "@"
self.advance
parse_target = true
@start = @current
end
if (c == " " || self.terminates?(c)) && parse_target
parse_target = false
@tokens.push(Token.new(Token::TARLINK,
@string[@start .. @current-1], @line))
end
break if self.terminates?(c)
end
else
self.handle_label
end
end
end
end
end
@file.close
@tokens.push(Token.new(Token::LBR, "", @line))
@tokens.push(Token.new(Token::EOF, "end_of_file", @line))
@tokens
end
|