Class: Ecu::LabelList::DcmLexer

Inherits:
Object
  • Object
show all
Defined in:
lib/ecu/interfaces/dcm/dcm_lexer.rb

Constant Summary collapse

KEYWORDS =
[
  "FUNKTIONEN", "FESTWERT", "FESTWERTEBLOCK", "KENNLINIE", "GRUPPENKENNLINIE", "FESTKENNLINIE",
  "KENNFELD", "GRUPPENKENNFELD", "FESTKENNFELD", "STUETZSTELLENVERTEILUNG",
  "FKT",
  "ST/X", "ST/Y", "WERT", "ST_TX/X", "ST_TX/Y", "TEXT",
  "FUNKTION",
  "EINHEIT_X", "EINHEIT_Y", "EINHEIT_W",
  "LANGNAME", "DISPLAYNAME",
  "END",
].freeze
HEADER =
"KONSERVIERUNG_FORMAT 2.0"
WHITESPACE =
%r{ [ \t]+ }x
NEWLINE =
%r{ \r\n|\n }x
COMMENT =
%r{ ^\*.*$ }x
DIMENSIONS_SEP =
%r{ @ }x
QUOTED_TEXT =
%r{ "[^"]*" }x
IDENTIFIER =
%r{ [A-Za-z][A-Za-z0-9_\.]* }x
UNSIGNED_INT =
%r{ [0]|[1-9][0-9]* }x
INT =
%r{ [-]?#{UNSIGNED_INT} }x
FLOAT_EXP =
%r{ [eE][+-]?[0-9]+ }x
FLOAT =
%r{
     [-+]?
     (?:
        #{UNSIGNED_INT}?[.][0-9]+#{FLOAT_EXP} |      # 1.23e10 or .45e3
        #{UNSIGNED_INT}          #{FLOAT_EXP} |      # 3e4
        #{UNSIGNED_INT}?[.][0-9]+             |      # 7.3 or .50
        #{UNSIGNED_INT} [.][0-9]*                    # 3.02 or 9.
     )
}x
KW_RE =
/#{Regexp.union(KEYWORDS.sort)}\b/
KW_TABLE =

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(doc) ⇒ DcmLexer

Returns a new instance of DcmLexer.



7
8
9
10
# File 'lib/ecu/interfaces/dcm/dcm_lexer.rb', line 7

def initialize(doc)
  @doc  = doc
  @scan = StringScanner.new(doc)
end

Instance Attribute Details

#docObject (readonly)

Returns the value of attribute doc.



6
7
8
# File 'lib/ecu/interfaces/dcm/dcm_lexer.rb', line 6

def doc
  @doc
end

Instance Method Details

#linenoObject



74
75
76
77
# File 'lib/ecu/interfaces/dcm/dcm_lexer.rb', line 74

def lineno
  @doc.byteslice(0, @scan.pos).count("\n") +
    (@scan.beginning_of_line? ? 0 : 1)
end

#next_tokenObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/ecu/interfaces/dcm/dcm_lexer.rb', line 46

def next_token
  @scan.skip(WHITESPACE)

  return if @scan.eos?

  case @scan.peek(1)
  when "\n", "\r" then @scan.skip(NEWLINE) && :NEWLINE
  when '"'        then @scan.skip(QUOTED_TEXT) && :QUOTED_TEXT
  when '*'        then @scan.skip(COMMENT) && :COMMENT
  when '@'        then @scan.skip(DIMENSIONS_SEP) && :DIMENSIONS_SEP
  when '-', '+', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
    if    @scan.skip(FLOAT) then :FLOAT
    elsif @scan.skip(INT)   then :INT
    else  @scan.getch;           :UNKNOWN_CHAR
    end
  else
    if    s = @scan.scan(KW_RE)    then KW_TABLE[s]
    elsif @scan.skip(HEADER)       then :HEADER
    elsif @scan.skip(IDENTIFIER)   then :IDENTIFIER
    else  @scan.getch;                  :UNKNOWN_CHAR
    end
  end
end

#token_valueObject



70
71
72
# File 'lib/ecu/interfaces/dcm/dcm_lexer.rb', line 70

def token_value
  @scan.matched
end