Syntax::YAML

A simple implementation of an YAML lexer. It handles most cases. It is not a validating lexer.

Public Instance Methods

step() click to toggle source

Step through a single iteration of the tokenization process. This will yield (potentially) many tokens, and possibly zero tokens.

    # File lib/syntax/lang/yaml.rb, line 11
11:     def step
12:       if bol?
13:         case
14:           when scan(/---(\s*.+)?$/)
15:             start_group :document, matched
16:           when scan(/(\s*)([a-zA-Z][-\w]*)(\s*):/)
17:             start_group :normal, subgroup(1)
18:             start_group :key, subgroup(2)
19:             start_group :normal, subgroup(3)
20:             start_group :punct, ":"
21:           when scan(/(\s*)-/)
22:             start_group :normal, subgroup(1)
23:             start_group :punct, "-"
24:           when scan(/\s*$/)
25:             start_group :normal, matched
26:           when scan(/#.*$/)
27:             start_group :comment, matched
28:           else
29:             append getch
30:         end
31:       else
32:         case
33:           when scan(/[\n\r]+/)
34:             start_group :normal, matched
35:           when scan(/[ \t]+/)
36:             start_group :normal, matched
37:           when scan(/!+(.*?^)?\S+/)
38:             start_group :type, matched
39:           when scan(/&\S+/)
40:             start_group :anchor, matched
41:           when scan(/\*\S+/)
42:             start_group :ref, matched
43:           when scan(/\d\d:\d\d:\d\d/)
44:             start_group :time, matched
45:           when scan(/\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d(\.\d+)? [-+]\d\d:\d\d/)
46:             start_group :date, matched
47:           when scan(/['"]/)
48:             start_group :punct, matched
49:             scan_string matched
50:           when scan(/:\w+/)
51:             start_group :symbol, matched
52:           when scan(/[:]/)
53:             start_group :punct, matched
54:           when scan(/#.*$/)
55:             start_group :comment, matched
56:           when scan(/>-?/)
57:             start_group :punct, matched
58:             start_group :normal, scan(/.*$/)
59:             append getch until eos? || bol?
60:             return if eos?
61:             indent = check(/ */)
62:             start_group :string
63:             loop do
64:               line = check_until(/[\n\r]|\Z/)
65:               break if line.nil?
66:               if line.chomp.length > 0
67:                 this_indent = line.chomp.match( /^\s*/ )[0]
68:                 break if this_indent.length < indent.length
69:               end
70:               append scan_until(/[\n\r]|\Z/)
71:             end
72:           else
73:             start_group :normal, scan_until(/(?=$|#)/)
74:         end
75:       end
76:     end

Private Instance Methods

scan_string( delim ) click to toggle source
    # File lib/syntax/lang/yaml.rb, line 80
80:       def scan_string( delim )
81:         regex = /(?=[#{delim=="'" ? "" : "\\\\"}#{delim}])/
82:         loop do
83:           text = scan_until( regex )
84:           if text.nil?
85:             start_group :string, scan_until( /\Z/ )
86:             break
87:           else
88:             start_group :string, text unless text.empty?
89:           end
90: 
91:           case peek(1)
92:             when "\\"
93:               start_group :expr, scan(/../)
94:             else
95:               start_group :punct, getch
96:               break
97:           end
98:         end
99:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.