annotate vendor/gems/coderay-0.9.7/test/functional/vhdl.rb @ 855:7294e8db2515 bug_162

Close obsolete branch bug_162
author Chris Cannam
date Thu, 14 Jul 2011 11:59:19 +0100
parents 0579821a129a
children
rev   line source
Chris@210 1 class VHDL < CodeRay::Scanners::Scanner
Chris@210 2
Chris@210 3 register_for :vhdl
Chris@210 4
Chris@210 5 RESERVED_WORDS = [
Chris@210 6 'access','after','alias','all','assert','architecture','begin',
Chris@210 7 'block','body','buffer','bus','case','component','configuration','constant',
Chris@210 8 'disconnect','downto','else','elsif','end','entity','exit','file','for',
Chris@210 9 'function','generate','generic','group','guarded','if','impure','in',
Chris@210 10 'inertial','inout','is','label','library','linkage','literal','loop',
Chris@210 11 'map','new','next','null','of','on','open','others','out','package',
Chris@210 12 'port','postponed','procedure','process','pure','range','record','register',
Chris@210 13 'reject','report','return','select','severity','signal','shared','subtype',
Chris@210 14 'then','to','transport','type','unaffected','units','until','use','variable',
Chris@210 15 'wait','when','while','with','note','warning','error','failure','and',
Chris@210 16 'or','xor','not','nor',
Chris@210 17 'array'
Chris@210 18 ]
Chris@210 19
Chris@210 20 PREDEFINED_TYPES = [
Chris@210 21 'bit','bit_vector','character','boolean','integer','real','time','string',
Chris@210 22 'severity_level','positive','natural','signed','unsigned','line','text',
Chris@210 23 'std_logic','std_logic_vector','std_ulogic','std_ulogic_vector','qsim_state',
Chris@210 24 'qsim_state_vector','qsim_12state','qsim_12state_vector','qsim_strength',
Chris@210 25 'mux_bit','mux_vector','reg_bit','reg_vector','wor_bit','wor_vector'
Chris@210 26 ]
Chris@210 27
Chris@210 28 PREDEFINED_CONSTANTS = [
Chris@210 29
Chris@210 30 ]
Chris@210 31
Chris@210 32 IDENT_KIND = CodeRay::CaseIgnoringWordList.new(:ident).
Chris@210 33 add(RESERVED_WORDS, :reserved).
Chris@210 34 add(PREDEFINED_TYPES, :pre_type).
Chris@210 35 add(PREDEFINED_CONSTANTS, :pre_constant)
Chris@210 36
Chris@210 37 ESCAPE = / [rbfntv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x
Chris@210 38 UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x
Chris@210 39
Chris@210 40 def scan_tokens tokens, options
Chris@210 41
Chris@210 42 state = :initial
Chris@210 43
Chris@210 44 until eos?
Chris@210 45
Chris@210 46 kind = nil
Chris@210 47 match = nil
Chris@210 48
Chris@210 49 case state
Chris@210 50
Chris@210 51 when :initial
Chris@210 52
Chris@210 53 if scan(/ \s+ | \\\n /x)
Chris@210 54 kind = :space
Chris@210 55
Chris@210 56 elsif scan(/-- .*/x)
Chris@210 57 kind = :comment
Chris@210 58
Chris@210 59 elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%]+ | \.(?!\d) /x)
Chris@210 60 kind = :operator
Chris@210 61
Chris@210 62 elsif match = scan(/ [A-Za-z_][A-Za-z_0-9]* /x)
Chris@210 63 kind = IDENT_KIND[match.downcase]
Chris@210 64
Chris@210 65 elsif match = scan(/[a-z]?"/i)
Chris@210 66 tokens << [:open, :string]
Chris@210 67 state = :string
Chris@210 68 kind = :delimiter
Chris@210 69
Chris@210 70 elsif scan(/ L?' (?: [^\'\n\\] | \\ #{ESCAPE} )? '? /ox)
Chris@210 71 kind = :char
Chris@210 72
Chris@210 73 elsif scan(/(?:\d+)(?![.eEfF])/)
Chris@210 74 kind = :integer
Chris@210 75
Chris@210 76 elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/)
Chris@210 77 kind = :float
Chris@210 78
Chris@210 79 else
Chris@210 80 getch
Chris@210 81 kind = :error
Chris@210 82
Chris@210 83 end
Chris@210 84
Chris@210 85 when :string
Chris@210 86 if scan(/[^\\\n"]+/)
Chris@210 87 kind = :content
Chris@210 88 elsif scan(/"/)
Chris@210 89 tokens << ['"', :delimiter]
Chris@210 90 tokens << [:close, :string]
Chris@210 91 state = :initial
Chris@210 92 next
Chris@210 93 elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox)
Chris@210 94 kind = :char
Chris@210 95 elsif scan(/ \\ | $ /x)
Chris@210 96 tokens << [:close, :string]
Chris@210 97 kind = :error
Chris@210 98 state = :initial
Chris@210 99 else
Chris@210 100 raise_inspect "else case \" reached; %p not handled." % peek(1), tokens
Chris@210 101 end
Chris@210 102
Chris@210 103 else
Chris@210 104 raise_inspect 'Unknown state', tokens
Chris@210 105
Chris@210 106 end
Chris@210 107
Chris@210 108 match ||= matched
Chris@210 109 if $DEBUG and not kind
Chris@210 110 raise_inspect 'Error token %p in line %d' %
Chris@210 111 [[match, kind], line], tokens
Chris@210 112 end
Chris@210 113 raise_inspect 'Empty token', tokens unless match
Chris@210 114
Chris@210 115 tokens << [match, kind]
Chris@210 116
Chris@210 117 end
Chris@210 118
Chris@210 119 if state == :string
Chris@210 120 tokens << [:close, :string]
Chris@210 121 end
Chris@210 122
Chris@210 123 tokens
Chris@210 124 end
Chris@210 125
Chris@210 126 end