@@ -53,6 +53,30 @@ def test_parse_line():
53
53
assert a .parse_line (next (lines )) == (None , '.data' , ()) # test left-aligned directive is not treated as label
54
54
55
55
56
+ def test_parse_labels_correctly ():
57
+ """
58
+ description of what defines a label
59
+ https://sourceware.org/binutils/docs/as/Statements.html
60
+ https://sourceware.org/binutils/docs/as/Labels.html
61
+ """
62
+ a = Assembler ()
63
+ assert a .parse_line ('label: .set const, 42' ) == ('label' , '.set' , ('const' , '42' ,))
64
+ assert a .parse_line ('label:.set const, 42' ) == ('label' , '.set' , ('const' , '42' ,))
65
+ assert a .parse_line ('label:' ) == ('label' , None , ())
66
+ assert a .parse_line (' label:' ) == ('label' , None , ())
67
+ assert a .parse_line (' label: ' ) == ('label' , None , ())
68
+ assert a .parse_line ('nop ' ) == (None , 'nop' , ())
69
+ assert a .parse_line ('.set c, 1 ' ) == (None , '.set' , ('c' , '1' ,))
70
+ assert a .parse_line ('invalid : nop' ) == (None , 'invalid' , (': nop' ,)) # no whitespace between label and colon
71
+ assert a .parse_line ('.string "hello world"' ) == (None , '.string' , ('"hello world"' ,))
72
+ assert a .parse_line ('.string "hello : world"' ) == (None , '.string' , ('"hello : world"' ,)) # colon in string
73
+ assert a .parse_line ('label::' ) == ('label' , ':' , ())
74
+ assert a .parse_line ('label: :' ) == ('label' , ':' , ())
75
+ assert a .parse_line ('a_label:' ) == ('a_label' , None , ())
76
+ assert a .parse_line ('$label:' ) == ('$label' , None , ())
77
+ assert a .parse_line ('.label:' ) == ('.label' , None , ())
78
+
79
+
56
80
def test_parse ():
57
81
a = Assembler ()
58
82
lines = remove_comments (src )
@@ -260,6 +284,7 @@ def test_support_multiple_statements_per_line():
260
284
261
285
262
286
test_parse_line ()
287
+ test_parse_labels_correctly ()
263
288
test_parse ()
264
289
test_assemble ()
265
290
test_assemble_bss ()
0 commit comments