@@ -11,5 +11,62 @@ def test_parse
1111 parser = Racc ::GrammarFileParser . new ( debug_flags )
1212 parser . parse ( File . read ( file ) , File . basename ( file ) )
1313 end
14+
15+ def test_allow_double_colon_in_class_name
16+ parser = Racc ::GrammarFileParser . new
17+
18+ result = parser . parse ( <<~RACC , 'namespace.y' )
19+ class Foo::Bar
20+ rule
21+ target : TERM
22+ end
23+ RACC
24+
25+ assert_equal 'Foo::Bar' , result . params . classname
26+ end
27+
28+ def test_reject_colon_prefixed_symbol_in_rule_body
29+ parser = Racc ::GrammarFileParser . new
30+ error = assert_raise ( CompileError ) do
31+ parser . parse ( <<~RACC , 'colon_prefixed_symbol.y' )
32+ class Parse
33+ rule
34+ target : :TERM1
35+ end
36+ RACC
37+ end
38+
39+ assert_equal "3: terminal and nonterminal symbols cannot start with ':', but got :TERM1" , error . message
40+ end
41+
42+ def test_reject_colon_prefixed_symbol_in_rule_alternative
43+ parser = Racc ::GrammarFileParser . new
44+ error = assert_raise ( CompileError ) do
45+ parser . parse ( <<~RACC , 'colon_prefixed_symbol.y' )
46+ class Parse
47+ rule
48+ target : TERM1
49+ | :TERM2
50+ end
51+ RACC
52+ end
53+
54+ assert_equal "4: terminal and nonterminal symbols cannot start with ':', but got :TERM2" , error . message
55+ end
56+
57+ def test_reject_colon_prefixed_symbol_after_rhs_symbol
58+ parser = Racc ::GrammarFileParser . new
59+ error = assert_raise ( CompileError ) do
60+ parser . parse ( <<~RACC , 'colon_prefixed_symbol.y' )
61+ class Parse
62+ rule
63+ target : TERM1
64+ | term :TERM2
65+ end
66+ RACC
67+ end
68+
69+ assert_equal "4: terminal and nonterminal symbols cannot start with ':', but got :TERM2" , error . message
70+ end
1471 end
1572end
0 commit comments