blob: 9d5d971ebaa84c91d3eb016a22fb49b56aa283d8 [file] [log] [blame]
#!/usr/bin/env ruby
#
# GroupFile.g
#
# Generated using ANTLR version: 3.2.1-SNAPSHOT Jun 18, 2010 05:38:11
# Ruby runtime library version: 1.7.5
# Input grammar file: GroupFile.g
# Generated at: 2010-07-03 23:15:35
#
# ~~~> start load path setup
this_directory = File.expand_path( File.dirname( __FILE__ ) )
$LOAD_PATH.unshift( this_directory ) unless $LOAD_PATH.include?( this_directory )
antlr_load_failed = proc do
load_path = $LOAD_PATH.map { |dir| ' - ' << dir }.join( $/ )
raise LoadError, <<-END.strip!
Failed to load the ANTLR3 runtime library (version 1.7.5):
Ensure the library has been installed on your system and is available
on the load path. If rubygems is available on your system, this can
be done with the command:
gem install antlr3
Current load path:
#{ load_path }
END
end
defined?( ANTLR3 ) or begin
# 1: try to load the ruby antlr3 runtime library from the system path
require 'antlr3'
rescue LoadError
# 2: try to load rubygems if it isn't already loaded
defined?( Gem ) or begin
require 'rubygems'
rescue LoadError
antlr_load_failed.call
end
# 3: try to activate the antlr3 gem
begin
Gem.activate( 'antlr3', '~> 1.7.5' )
rescue Gem::LoadError
antlr_load_failed.call
end
require 'antlr3'
end
# <~~~ end load path setup
# - - - - - - begin action @lexer::header - - - - - -
# GroupFile.g
module ANTLR3
module Template
# - - - - - - end action @lexer::header - - - - - - -
module GroupFile
# TokenData defines all of the token type integer values
# as constants, which will be included in all
# ANTLR-generated recognizers.
const_defined?( :TokenData ) or TokenData = ANTLR3::TokenScheme.new
module TokenData
# define the token constants
define_tokens( :ID => 5, :EOF => -1, :T__19 => 19, :WS => 9, :T__16 => 16,
:T__15 => 15, :T__18 => 18, :T__17 => 17, :T__12 => 12,
:TEMPLATE => 6, :T__11 => 11, :T__14 => 14, :T__13 => 13,
:T__10 => 10, :CONSTANT => 4, :COMMENT => 8, :STRING => 7 )
end
class Lexer < ANTLR3::Lexer
@grammar_home = GroupFile
include TokenData
begin
generated_using( "GroupFile.g", "3.2.1-SNAPSHOT Jun 18, 2010 05:38:11", "1.7.5" )
rescue NoMethodError => error
# ignore
end
RULE_NAMES = [ "T__10", "T__11", "T__12", "T__13", "T__14", "T__15",
"T__16", "T__17", "T__18", "T__19", "CONSTANT", "ID",
"TEMPLATE", "STRING", "COMMENT", "WS" ].freeze
RULE_METHODS = [ :t__10!, :t__11!, :t__12!, :t__13!, :t__14!, :t__15!,
:t__16!, :t__17!, :t__18!, :t__19!, :constant!, :id!,
:template!, :string!, :comment!, :ws! ].freeze
def initialize( input=nil, options = {} )
super( input, options )
end
# - - - - - - - - - - - lexer rules - - - - - - - - - - - -
# lexer rule t__10! (T__10)
# (in GroupFile.g)
def t__10!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 1 )
type = T__10
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 16:9: 'group'
match( "group" )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 1 )
end
# lexer rule t__11! (T__11)
# (in GroupFile.g)
def t__11!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 2 )
type = T__11
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 17:9: '::'
match( "::" )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 2 )
end
# lexer rule t__12! (T__12)
# (in GroupFile.g)
def t__12!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 3 )
type = T__12
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 18:9: ';'
match( 0x3b )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 3 )
end
# lexer rule t__13! (T__13)
# (in GroupFile.g)
def t__13!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 4 )
type = T__13
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 19:9: '::='
match( "::=" )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 4 )
end
# lexer rule t__14! (T__14)
# (in GroupFile.g)
def t__14!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 5 )
type = T__14
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 20:9: '('
match( 0x28 )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 5 )
end
# lexer rule t__15! (T__15)
# (in GroupFile.g)
def t__15!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 6 )
type = T__15
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 21:9: ')'
match( 0x29 )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 6 )
end
# lexer rule t__16! (T__16)
# (in GroupFile.g)
def t__16!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 7 )
type = T__16
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 22:9: ','
match( 0x2c )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 7 )
end
# lexer rule t__17! (T__17)
# (in GroupFile.g)
def t__17!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 8 )
type = T__17
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 23:9: '*'
match( 0x2a )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 8 )
end
# lexer rule t__18! (T__18)
# (in GroupFile.g)
def t__18!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 9 )
type = T__18
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 24:9: '&'
match( 0x26 )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 9 )
end
# lexer rule t__19! (T__19)
# (in GroupFile.g)
def t__19!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 10 )
type = T__19
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 25:9: '='
match( 0x3d )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 10 )
end
# lexer rule constant! (CONSTANT)
# (in GroupFile.g)
def constant!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 11 )
type = CONSTANT
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 125:5: 'A' .. 'Z' ( 'a' .. 'z' | '_' | 'A' .. 'Z' | '0' .. '9' )*
match_range( 0x41, 0x5a )
# at line 125:14: ( 'a' .. 'z' | '_' | 'A' .. 'Z' | '0' .. '9' )*
while true # decision 1
alt_1 = 2
look_1_0 = @input.peek( 1 )
if ( look_1_0.between?( 0x30, 0x39 ) || look_1_0.between?( 0x41, 0x5a ) || look_1_0 == 0x5f || look_1_0.between?( 0x61, 0x7a ) )
alt_1 = 1
end
case alt_1
when 1
# at line
if @input.peek( 1 ).between?( 0x30, 0x39 ) || @input.peek( 1 ).between?( 0x41, 0x5a ) || @input.peek( 1 ) == 0x5f || @input.peek( 1 ).between?( 0x61, 0x7a )
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
else
break # out of loop for decision 1
end
end # loop for decision 1
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 11 )
end
# lexer rule id! (ID)
# (in GroupFile.g)
def id!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 12 )
type = ID
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 129:5: ( 'a' .. 'z' | '_' ) ( 'a' .. 'z' | '_' | 'A' .. 'Z' | '0' .. '9' )*
if @input.peek( 1 ) == 0x5f || @input.peek( 1 ).between?( 0x61, 0x7a )
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
# at line 130:5: ( 'a' .. 'z' | '_' | 'A' .. 'Z' | '0' .. '9' )*
while true # decision 2
alt_2 = 2
look_2_0 = @input.peek( 1 )
if ( look_2_0.between?( 0x30, 0x39 ) || look_2_0.between?( 0x41, 0x5a ) || look_2_0 == 0x5f || look_2_0.between?( 0x61, 0x7a ) )
alt_2 = 1
end
case alt_2
when 1
# at line
if @input.peek( 1 ).between?( 0x30, 0x39 ) || @input.peek( 1 ).between?( 0x41, 0x5a ) || @input.peek( 1 ) == 0x5f || @input.peek( 1 ).between?( 0x61, 0x7a )
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
else
break # out of loop for decision 2
end
end # loop for decision 2
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 12 )
end
# lexer rule template! (TEMPLATE)
# (in GroupFile.g)
def template!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 13 )
type = TEMPLATE
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 134:5: '<<<' ( options {greedy=false; } : '\\\\' . | . )* '>>>'
match( "<<<" )
# at line 135:5: ( options {greedy=false; } : '\\\\' . | . )*
while true # decision 3
alt_3 = 3
look_3_0 = @input.peek( 1 )
if ( look_3_0 == 0x3e )
look_3_1 = @input.peek( 2 )
if ( look_3_1 == 0x3e )
look_3_4 = @input.peek( 3 )
if ( look_3_4 == 0x3e )
alt_3 = 3
elsif ( look_3_4.between?( 0x0, 0x3d ) || look_3_4.between?( 0x3f, 0xffff ) )
alt_3 = 2
end
elsif ( look_3_1.between?( 0x0, 0x3d ) || look_3_1.between?( 0x3f, 0xffff ) )
alt_3 = 2
end
elsif ( look_3_0 == 0x5c )
look_3_2 = @input.peek( 2 )
if ( look_3_2 == 0x3e )
alt_3 = 1
elsif ( look_3_2 == 0x5c )
alt_3 = 1
elsif ( look_3_2.between?( 0x0, 0x3d ) || look_3_2.between?( 0x3f, 0x5b ) || look_3_2.between?( 0x5d, 0xffff ) )
alt_3 = 1
end
elsif ( look_3_0.between?( 0x0, 0x3d ) || look_3_0.between?( 0x3f, 0x5b ) || look_3_0.between?( 0x5d, 0xffff ) )
alt_3 = 2
end
case alt_3
when 1
# at line 135:35: '\\\\' .
match( 0x5c )
match_any
when 2
# at line 135:44: .
match_any
else
break # out of loop for decision 3
end
end # loop for decision 3
match( ">>>" )
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 13 )
end
# lexer rule string! (STRING)
# (in GroupFile.g)
def string!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 14 )
type = STRING
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 140:3: ( '\"' (~ ( '\\\\' | '\"' ) | '\\\\' . )* '\"' | '\\'' (~ ( '\\\\' | '\\'' ) | '\\\\' . )* '\\'' )
alt_6 = 2
look_6_0 = @input.peek( 1 )
if ( look_6_0 == 0x22 )
alt_6 = 1
elsif ( look_6_0 == 0x27 )
alt_6 = 2
else
raise NoViableAlternative( "", 6, 0 )
end
case alt_6
when 1
# at line 140:5: '\"' (~ ( '\\\\' | '\"' ) | '\\\\' . )* '\"'
match( 0x22 )
# at line 140:10: (~ ( '\\\\' | '\"' ) | '\\\\' . )*
while true # decision 4
alt_4 = 3
look_4_0 = @input.peek( 1 )
if ( look_4_0.between?( 0x0, 0x21 ) || look_4_0.between?( 0x23, 0x5b ) || look_4_0.between?( 0x5d, 0xffff ) )
alt_4 = 1
elsif ( look_4_0 == 0x5c )
alt_4 = 2
end
case alt_4
when 1
# at line 140:12: ~ ( '\\\\' | '\"' )
if @input.peek( 1 ).between?( 0x0, 0x21 ) || @input.peek( 1 ).between?( 0x23, 0x5b ) || @input.peek( 1 ).between?( 0x5d, 0xff )
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
when 2
# at line 140:31: '\\\\' .
match( 0x5c )
match_any
else
break # out of loop for decision 4
end
end # loop for decision 4
match( 0x22 )
when 2
# at line 141:5: '\\'' (~ ( '\\\\' | '\\'' ) | '\\\\' . )* '\\''
match( 0x27 )
# at line 141:10: (~ ( '\\\\' | '\\'' ) | '\\\\' . )*
while true # decision 5
alt_5 = 3
look_5_0 = @input.peek( 1 )
if ( look_5_0.between?( 0x0, 0x26 ) || look_5_0.between?( 0x28, 0x5b ) || look_5_0.between?( 0x5d, 0xffff ) )
alt_5 = 1
elsif ( look_5_0 == 0x5c )
alt_5 = 2
end
case alt_5
when 1
# at line 141:12: ~ ( '\\\\' | '\\'' )
if @input.peek( 1 ).between?( 0x0, 0x26 ) || @input.peek( 1 ).between?( 0x28, 0x5b ) || @input.peek( 1 ).between?( 0x5d, 0xff )
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
when 2
# at line 141:31: '\\\\' .
match( 0x5c )
match_any
else
break # out of loop for decision 5
end
end # loop for decision 5
match( 0x27 )
end
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 14 )
end
# lexer rule comment! (COMMENT)
# (in GroupFile.g)
def comment!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 15 )
type = COMMENT
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 146:3: ( ( '#' | '//' ) (~ '\\n' )* | '/*' ( . )* '*/' )
alt_10 = 2
look_10_0 = @input.peek( 1 )
if ( look_10_0 == 0x23 )
alt_10 = 1
elsif ( look_10_0 == 0x2f )
look_10_2 = @input.peek( 2 )
if ( look_10_2 == 0x2f )
alt_10 = 1
elsif ( look_10_2 == 0x2a )
alt_10 = 2
else
raise NoViableAlternative( "", 10, 2 )
end
else
raise NoViableAlternative( "", 10, 0 )
end
case alt_10
when 1
# at line 146:5: ( '#' | '//' ) (~ '\\n' )*
# at line 146:5: ( '#' | '//' )
alt_7 = 2
look_7_0 = @input.peek( 1 )
if ( look_7_0 == 0x23 )
alt_7 = 1
elsif ( look_7_0 == 0x2f )
alt_7 = 2
else
raise NoViableAlternative( "", 7, 0 )
end
case alt_7
when 1
# at line 146:7: '#'
match( 0x23 )
when 2
# at line 146:13: '//'
match( "//" )
end
# at line 146:20: (~ '\\n' )*
while true # decision 8
alt_8 = 2
look_8_0 = @input.peek( 1 )
if ( look_8_0.between?( 0x0, 0x9 ) || look_8_0.between?( 0xb, 0xffff ) )
alt_8 = 1
end
case alt_8
when 1
# at line 146:20: ~ '\\n'
if @input.peek( 1 ).between?( 0x0, 0x9 ) || @input.peek( 1 ).between?( 0xb, 0xff )
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
else
break # out of loop for decision 8
end
end # loop for decision 8
when 2
# at line 147:5: '/*' ( . )* '*/'
match( "/*" )
# at line 147:10: ( . )*
while true # decision 9
alt_9 = 2
look_9_0 = @input.peek( 1 )
if ( look_9_0 == 0x2a )
look_9_1 = @input.peek( 2 )
if ( look_9_1 == 0x2f )
alt_9 = 2
elsif ( look_9_1.between?( 0x0, 0x2e ) || look_9_1.between?( 0x30, 0xffff ) )
alt_9 = 1
end
elsif ( look_9_0.between?( 0x0, 0x29 ) || look_9_0.between?( 0x2b, 0xffff ) )
alt_9 = 1
end
case alt_9
when 1
# at line 147:10: .
match_any
else
break # out of loop for decision 9
end
end # loop for decision 9
match( "*/" )
end
@state.type = type
@state.channel = channel
# --> action
skip
# <-- action
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 15 )
end
# lexer rule ws! (WS)
# (in GroupFile.g)
def ws!
# -> uncomment the next line to manually enable rule tracing
# trace_in( __method__, 16 )
type = WS
channel = ANTLR3::DEFAULT_CHANNEL
# - - - - main rule block - - - -
# at line 151:5: ( ' ' | '\\t' | '\\n' | '\\r' | '\\f' )+
# at file 151:5: ( ' ' | '\\t' | '\\n' | '\\r' | '\\f' )+
match_count_11 = 0
while true
alt_11 = 2
look_11_0 = @input.peek( 1 )
if ( look_11_0.between?( 0x9, 0xa ) || look_11_0.between?( 0xc, 0xd ) || look_11_0 == 0x20 )
alt_11 = 1
end
case alt_11
when 1
# at line
if @input.peek( 1 ).between?( 0x9, 0xa ) || @input.peek( 1 ).between?( 0xc, 0xd ) || @input.peek( 1 ) == 0x20
@input.consume
else
mse = MismatchedSet( nil )
recover mse
raise mse
end
else
match_count_11 > 0 and break
eee = EarlyExit( 11 )
raise eee
end
match_count_11 += 1
end
# --> action
skip
# <-- action
@state.type = type
@state.channel = channel
ensure
# -> uncomment the next line to manually enable rule tracing
# trace_out( __method__, 16 )
end
# main rule used to study the input at the current position,
# and choose the proper lexer rule to call in order to
# fetch the next token
#
# usually, you don't make direct calls to this method,
# but instead use the next_token method, which will
# build and emit the actual next token
def token!
# at line 1:8: ( T__10 | T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | CONSTANT | ID | TEMPLATE | STRING | COMMENT | WS )
alt_12 = 16
alt_12 = @dfa12.predict( @input )
case alt_12
when 1
# at line 1:10: T__10
t__10!
when 2
# at line 1:16: T__11
t__11!
when 3
# at line 1:22: T__12
t__12!
when 4
# at line 1:28: T__13
t__13!
when 5
# at line 1:34: T__14
t__14!
when 6
# at line 1:40: T__15
t__15!
when 7
# at line 1:46: T__16
t__16!
when 8
# at line 1:52: T__17
t__17!
when 9
# at line 1:58: T__18
t__18!
when 10
# at line 1:64: T__19
t__19!
when 11
# at line 1:70: CONSTANT
constant!
when 12
# at line 1:79: ID
id!
when 13
# at line 1:82: TEMPLATE
template!
when 14
# at line 1:91: STRING
string!
when 15
# at line 1:98: COMMENT
comment!
when 16
# at line 1:106: WS
ws!
end
end
# - - - - - - - - - - DFA definitions - - - - - - - - - - -
class DFA12 < ANTLR3::DFA
EOT = unpack( 1, -1, 1, 11, 14, -1, 1, 11, 1, 20, 1, 11, 2, -1, 1,
11, 1, 23, 1, -1 )
EOF = unpack( 24, -1 )
MIN = unpack( 1, 9, 1, 114, 1, 58, 13, -1, 1, 111, 1, 61, 1, 117,
2, -1, 1, 112, 1, 48, 1, -1 )
MAX = unpack( 1, 122, 1, 114, 1, 58, 13, -1, 1, 111, 1, 61, 1, 117,
2, -1, 1, 112, 1, 122, 1, -1 )
ACCEPT = unpack( 3, -1, 1, 3, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10,
1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, 16, 3, -1,
1, 4, 1, 2, 2, -1, 1, 1 )
SPECIAL = unpack( 24, -1 )
TRANSITION = [
unpack( 2, 15, 1, -1, 2, 15, 18, -1, 1, 15, 1, -1, 1, 13, 1, 14,
2, -1, 1, 8, 1, 13, 1, 4, 1, 5, 1, 7, 1, -1, 1, 6, 2, -1,
1, 14, 10, -1, 1, 2, 1, 3, 1, 12, 1, 9, 3, -1, 26, 10, 4,
-1, 1, 11, 1, -1, 6, 11, 1, 1, 19, 11 ),
unpack( 1, 16 ),
unpack( 1, 17 ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( ),
unpack( 1, 18 ),
unpack( 1, 19 ),
unpack( 1, 21 ),
unpack( ),
unpack( ),
unpack( 1, 22 ),
unpack( 10, 11, 7, -1, 26, 11, 4, -1, 1, 11, 1, -1, 26, 11 ),
unpack( )
].freeze
( 0 ... MIN.length ).zip( MIN, MAX ) do | i, a, z |
if a > 0 and z < 0
MAX[ i ] %= 0x10000
end
end
@decision = 12
def description
<<-'__dfa_description__'.strip!
1:1: Tokens : ( T__10 | T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | CONSTANT | ID | TEMPLATE | STRING | COMMENT | WS );
__dfa_description__
end
end
private
def initialize_dfas
super rescue nil
@dfa12 = DFA12.new( self, 12 )
end
end # class Lexer < ANTLR3::Lexer
at_exit { Lexer.main( ARGV ) } if __FILE__ == $0
end
# - - - - - - begin action @lexer::footer - - - - - -
# GroupFile.g
end # module Template
end # module ANTLR3
# - - - - - - end action @lexer::footer - - - - - - -