Skip to content

Commit 00ebdbb

Browse files
authored
Merge pull request #262 from yui-knk/support_expect_bang
Support `error_on_expect_mismatch` declaration in Racc grammar file
2 parents 354e98a + 8f4ad92 commit 00ebdbb

File tree

6 files changed

+28
-0
lines changed

6 files changed

+28
-0
lines changed

bin/racc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ def main
193193
end
194194

195195
profiler.report
196+
if states.should_error_on_expect_mismatch?
197+
raise Racc::CompileError, "#{states.grammar.n_expected_srconflicts} shift/reduce conflicts are expected but #{states.n_srconflicts} shift/reduce conflicts exist"
198+
end
196199
rescue Racc::Error, Errno::ENOENT, Errno::EPERM => err
197200
raise if $DEBUG or debug_flags.any?
198201
lineno = err.message.slice(/\A\d+:/).to_s

lib/racc/grammar.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ def initialize(debug_flags = DebugFlags.new)
2727
@rules = [] # :: [Rule]
2828
@start = nil
2929
@n_expected_srconflicts = nil
30+
@error_on_expect_mismatch = nil
3031
@prec_table = []
3132
@prec_table_closed = false
3233
@closed = false
@@ -36,6 +37,7 @@ def initialize(debug_flags = DebugFlags.new)
3637
attr_reader :start
3738
attr_reader :symboltable
3839
attr_accessor :n_expected_srconflicts
40+
attr_accessor :error_on_expect_mismatch
3941

4042
def [](x)
4143
@rules[x]

lib/racc/grammarfileparser.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ module Racc
7676
raise CompileError, "`expect' seen twice"
7777
end
7878
@grammar.n_expected_srconflicts = num
79+
}\
80+
| seq(:ERROR_ON_EXPECT_MISMATCH) {|*|
81+
@grammar.error_on_expect_mismatch = true
7982
}
8083

8184
g.convdef = seq(:symbol, :STRING) {|sym, code|
@@ -493,6 +496,7 @@ def next_line
493496
'options' => :OPTION,
494497
'start' => :START,
495498
'expect' => :EXPECT,
499+
'error_on_expect_mismatch' => :ERROR_ON_EXPECT_MISMATCH,
496500
'class' => :CLASS,
497501
'rule' => :RULE,
498502
'end' => :END

lib/racc/state.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ def should_report_srconflict?
7373
(n_srconflicts() != @grammar.n_expected_srconflicts)
7474
end
7575

76+
def should_error_on_expect_mismatch?
77+
should_report_srconflict? && @grammar.error_on_expect_mismatch
78+
end
79+
7680
def srconflict_exist?
7781
n_srconflicts() != 0
7882
end
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class E
2+
expect 0
3+
error_on_expect_mismatch
4+
rule
5+
list: inlist inlist
6+
inlist:
7+
| A
8+
end

test/test_racc_command.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ def test_expect_y
108108
assert_debugfile 'expect.y', [1,0,0,0,1]
109109
end
110110

111+
def test_error_on_expect_mismatch
112+
assert_raise_with_message(Test::Unit::AssertionFailedError, /0 shift\/reduce conflicts are expected but 1 shift\/reduce conflicts exist/) {
113+
assert_compile 'error_on_expect_mismatch.y'
114+
}
115+
assert_debugfile 'error_on_expect_mismatch.y', [1,0,0,0,0]
116+
end
117+
111118
def test_nullbug1_y
112119
assert_compile 'nullbug1.y'
113120
assert_debugfile 'nullbug1.y', [0,0,0,0]

0 commit comments

Comments
 (0)