From 4e2cb2958a565c75e1dfe606e6e96f2e6ec6a8c7 Mon Sep 17 00:00:00 2001 From: Nathan Youngman Date: Sat, 27 Oct 2012 14:07:22 -0600 Subject: [PATCH 1/3] AVR Assembler Scanner by Andreas Schwarz --- lib/coderay/scanners/avrasm.rb | 153 +++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 lib/coderay/scanners/avrasm.rb diff --git a/lib/coderay/scanners/avrasm.rb b/lib/coderay/scanners/avrasm.rb new file mode 100644 index 00000000..b3fc28d6 --- /dev/null +++ b/lib/coderay/scanners/avrasm.rb @@ -0,0 +1,153 @@ +module CodeRay +module Scanners + + class AVRASM < Scanner + + register_for :avrasm + + RESERVED_WORDS = [ + ] + + PREDEFINED_TYPES = [ + ] + + PREDEFINED_CONSTANTS = [ + ] + + IDENT_KIND = CaseIgnoringWordList.new(:ident). + add(RESERVED_WORDS, :reserved). + add(PREDEFINED_TYPES, :pre_type). + add(PREDEFINED_CONSTANTS, :pre_constant) + + ESCAPE = / [rbfnrtv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x + UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x + + def scan_tokens tokens, options + + state = :initial + + until eos? + + kind = nil + match = nil + + case state + + when :initial + + if scan(/ \s+ | \\\n /x) + kind = :space + + elsif scan(/;.*/x) + kind = :comment + + elsif scan(/\.(\w*)/x) + kind = :preprocessor + state = :include_expected if self[1] == 'include' + + elsif scan(/@[0-9]+/) + kind = :preprocessor + + elsif scan(/ [-+*\/=<>?:;,!&^|()\[\]{}~%]+ | \.(?!\d) /x) + kind = :operator + + elsif scan(/r[0-9]+/i) + # register R0-R31 + kind = :pre_constant + + elsif match = scan(/ [A-Za-z_][A-Za-z_0-9]* /x) + kind = IDENT_KIND[match] + if kind == :ident and check(/:(?!:)/) + match << scan(/:/) + kind = :label + end + + elsif match = scan(/"/) + tokens << [:open, :string] + state = :string + kind = :delimiter + + elsif scan(/ L?' (?: [^\'\n\\] | \\ #{ESCAPE} )? '? /ox) + kind = :char + + elsif scan(/0[xX][0-9A-Fa-f]+/) + kind = :integer + + elsif scan(/(?:0[0-7]+)(?![89.eEfF])/) + kind = :integer + + elsif scan(/0[bB][0-9A-Fa-f]+/) + kind = :integer + + elsif scan(/(?:\d+)(?![.eEfF])/) + kind = :integer + + elsif scan(/\d[fF]?|\d*\.\d+(?:[eE][+-]?\d+)?[fF]?|\d+[eE][+-]?\d+[fF]?/) + kind = :float + + else + getch + kind = :error + + end + + when :string + if scan(/[^\\\n"]+/) + kind = :content + elsif scan(/"/) + tokens << ['"', :delimiter] + tokens << [:close, :string] + state = :initial + next + elsif scan(/ \\ (?: #{ESCAPE} | #{UNICODE_ESCAPE} ) /mox) + kind = :char + elsif scan(/ \\ | $ /x) + tokens << [:close, :string] + kind = :error + state = :initial + else + raise_inspect "else case \" reached; %p not handled." % peek(1), tokens + end + + when :include_expected + if scan(/<[^>\n]+>?|"[^"\n\\]*(?:\\.[^"\n\\]*)*"?/) + kind = :include + state = :initial + + elsif match = scan(/\s+/) + kind = :space + state = :initial if match.index ?\n + + else + getch + kind = :error + + end + + else + raise_inspect 'Unknown state', tokens + + end + + match ||= matched + if $DEBUG and not kind + raise_inspect 'Error token %p in line %d' % + [[match, kind], line], tokens + end + raise_inspect 'Empty token', tokens unless match + + tokens << [match, kind] + + end + + if state == :string + tokens << [:close, :string] + end + + tokens + end + + end + +end +end From 31bfa4e3d3c6e033080492b3a0ec037150cad38f Mon Sep 17 00:00:00 2001 From: Nathan Youngman Date: Sat, 27 Oct 2012 14:08:07 -0600 Subject: [PATCH 2/3] by line --- lib/coderay/scanners/avrasm.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/coderay/scanners/avrasm.rb b/lib/coderay/scanners/avrasm.rb index b3fc28d6..b412fb30 100644 --- a/lib/coderay/scanners/avrasm.rb +++ b/lib/coderay/scanners/avrasm.rb @@ -1,6 +1,7 @@ module CodeRay module Scanners + # by Andreas Schwarz class AVRASM < Scanner register_for :avrasm @@ -44,7 +45,7 @@ def scan_tokens tokens, options elsif scan(/\.(\w*)/x) kind = :preprocessor state = :include_expected if self[1] == 'include' - + elsif scan(/@[0-9]+/) kind = :preprocessor From 199a6437c32b843ba2c2c20c8b7966db5ceb0826 Mon Sep 17 00:00:00 2001 From: Nathan Youngman Date: Sat, 27 Oct 2012 14:08:35 -0600 Subject: [PATCH 3/3] lint: duplicate character class --- lib/coderay/scanners/avrasm.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/coderay/scanners/avrasm.rb b/lib/coderay/scanners/avrasm.rb index b412fb30..54302660 100644 --- a/lib/coderay/scanners/avrasm.rb +++ b/lib/coderay/scanners/avrasm.rb @@ -20,7 +20,7 @@ class AVRASM < Scanner add(PREDEFINED_TYPES, :pre_type). add(PREDEFINED_CONSTANTS, :pre_constant) - ESCAPE = / [rbfnrtv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x + ESCAPE = / [rbfntv\n\\'"] | x[a-fA-F0-9]{1,2} | [0-7]{1,3} /x UNICODE_ESCAPE = / u[a-fA-F0-9]{4} | U[a-fA-F0-9]{8} /x def scan_tokens tokens, options