summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-13 17:54:43 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-03-13 17:54:43 +0000
commitfa37ab769fa4adac50959b514793e8d1a39a09ce (patch)
tree112074cd69b0a4008f0521afbb537846e014f2aa /tool
parentbce5056cab71b0df70393a5673627c7bd7c8b4e7 (diff)
* tool/transcode-tblgen.rb: reject ambiguous mapping.
* enc/trans/single_byte.trans: remove ambiguous maping such as \xD6 -> U+05F2 and \xD6\xC7 -> U+FB1F in Windows-1255 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26912 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool')
-rwxr-xr-xtool/transcode-tblgen.rb19
1 files changed, 19 insertions, 0 deletions
diff --git a/tool/transcode-tblgen.rb b/tool/transcode-tblgen.rb
index dbd03e3028..14a09dbadf 100755
--- a/tool/transcode-tblgen.rb
+++ b/tool/transcode-tblgen.rb
@@ -133,6 +133,12 @@ class StrSet
}
end
+ def has_nonempty?
+ @pat.any? {|seq|
+ !seq.empty?
+ }
+ end
+
def first_bytes
result = {}
@pat.each {|seq|
@@ -228,6 +234,18 @@ class ActionMap
@map.keys.map {|k| k.max_length }.max
end
+ def check_conflict
+ has_empty = false
+ has_nonempty = false
+ @map.each {|ss, action|
+ has_empty = true if ss.emptyable?
+ has_nonempty = true if ss.has_nonempty?
+ }
+ if has_empty && has_nonempty
+ raise "conflict between empty and nonempty sequence"
+ end
+ end
+
def empty_action
@map.each {|ss, action|
return action if ss.emptyable?
@@ -440,6 +458,7 @@ End
table = Array.new(0x100, :invalid)
each_firstbyte(valid_encoding) {|byte, rest, rest_valid_encoding|
+ rest.check_conflict
if a = rest.empty_action
table[byte] = a
else