@@ -53,6 +53,30 @@ def test_parse_line():
5353 assert a .parse_line (next (lines )) == (None , '.data' , ()) # test left-aligned directive is not treated as label
5454
5555
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+
5680def test_parse ():
5781 a = Assembler ()
5882 lines = remove_comments (src )
@@ -260,6 +284,7 @@ def test_support_multiple_statements_per_line():
260284
261285
262286test_parse_line ()
287+ test_parse_labels_correctly ()
263288test_parse ()
264289test_assemble ()
265290test_assemble_bss ()
0 commit comments