← Back to team overview

kicad-developers team mailing list archive

Build error

 

I just got a build error on Linux, at git commit 218f66a08, which appears to be the latest commit.

In file included from /builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra.h:36:0,
                 from /builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_import.cpp:50:
/builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_lexer.h:1075:2: error: #endif without #if
 #endif   // SPECCTRA_LEXER_H_
  ^~~~~
/builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_lexer.h:308:25: error: expected '}' before 'T_absolute'
         T_routes        T_absolute = 0,
                         ^~~~~~~~~~
/builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_lexer.h:308:38: error: invalid conversion from 'int' to 'DSN::T' [-fpermissive]
         T_routes        T_absolute = 0,
                                      ^
/builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_lexer.h:309:1: error: expected unqualified-id before ',' token
 ,
 ^
/builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_lexer.h:310:33: error: expected initializer before 'T_add_group'
         T_routes_include        T_add_group,
                                 ^~~~~~~~~~~
/builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra_lexer.h:511:1: error: expected declaration before '}' token
 }   // namespace DSN
 ^
make[2]: *** [pcbnew/CMakeFiles/pcbnew_kiface_objects.dir/build.make:4979: pcbnew/CMakeFiles/pcbnew_kiface_objects.dir/specctra_import_export/specctra_import.cpp.o] Error 1


I looked at specctra_lexer.h (attached) and sure enough it has an unbalanced #ifndef / #endif.  This file is apparently auto-generated by cmake - I have no knowledge of the details.

	Steve
/* Do not modify this file it was automatically generated by the
 * TokenList2DsnLexer CMake script.
 */

#ifndef SPECCTRA_LEXER_H_
#define SPECCTRA_LEXER_H_

#include <dsnlexer.h>

/**
 * C++ does not put enum _values_ in separate namespaces unless the enum itself
 * is in a separate namespace.  All the token enums must be in separate namespaces
 * otherwise the C++ compiler will eventually complain if it sees more than one
 * DSNLEXER in the same compilation unit, say by mutliple header file inclusion.
 * Plus this also enables re-use of the same enum name T.  A typedef can always be used
 * to clarify which enum T is in play should that ever be a problem.  This is
 * unlikely since Parse() functions will usually only be exposed to one header
 * file like this one.  But if there is a problem, then use:
 *   typedef DSN::T T;
 * within that problem area.
 */
namespace DSN
{
    /// enum T contains all this lexer's tokens.
    enum T
    {
        // these first few are negative special ones for syntax, and are
        // inherited from DSNLEXER.
        T_NONE          = DSN_NONE,
        T_COMMENT       = DSN_COMMENT,
        T_STRING_QUOTE  = DSN_STRING_QUOTE,
        T_QUOTE_DEF     = DSN_QUOTE_DEF,
        T_DASH          = DSN_DASH,
        T_SYMBOL        = DSN_SYMBOL,
        T_NUMBER        = DSN_NUMBER,
        T_RIGHT         = DSN_RIGHT,        // right bracket: ')'
        T_LEFT          = DSN_LEFT,         // left bracket:  '('
        T_STRING        = DSN_STRING,       // a quoted string, stripped of the quotes
        T_EOF           = DSN_EOF,          // special case for end of file

        T_back,
        T_base_design,
        T_bbv_ctr2ctr,
        T_bend_keepout,
        T_bond,
        T_both,
        T_bottom,
        T_bottom_layer_sel,
        T_boundary,
        T_brickpat,
        T_bundle,
        T_bus,
        T_bypass,
        T_capacitance_resolution,
        T_capacitor,
        T_case_sensitive,
        T_cct1,
        T_cct1a,
        T_center_center,
        T_checking_trim_by_pin,
        T_circ,
        T_circle,
        T_circuit,
        T_class,
        T_class_class,
        T_classes,
        T_clear,
        T_clearance,
        T_cluster,
        T_cm,
        T_color,
        T_colors,
        T_comment,
        T_comp,
        T_comp_edge_center,
        T_comp_order,
        T_component,
        T_composite,
        T_conductance_resolution,
        T_conductor,
        T_conflict,
        T_connect,
        T_constant,
        T_contact,
        T_control,
        T_corner,
        T_corners,
        T_cost,
        T_created_time,
        T_cross,
        T_crosstalk_model,
        T_current_resolution,
        T_deleted,
        T_deleted_keepout,
        T_delta,
        T_diagonal,
        T_direction,
        T_directory,
        T_discrete,
        T_effective_via_length,
        T_elongate_keepout,
        T_exclude,
        T_expose,
        T_extra_image_directory,
        T_family,
        T_family_family,
        T_family_family_spacing,
        T_fanout,
        T_farad,
        T_file,
        T_fit,
        T_fix,
        T_flip_style,
        T_floor_plan,
        T_footprint,
        T_forbidden,
        T_force_to_terminal_point,
        T_forgotten,
        T_free,
        T_fromto,
        T_front,
        T_front_only,
        T_gap,
        T_gate,
        T_gates,
        T_generated_by_freeroute,
        T_global,
        T_grid,
        T_group,
        T_group_set,
        T_guide,
        T_hard,
        T_height,
        T_high,
        T_history,
        T_horizontal,
        T_host_cad,
        T_host_version,
        T_image,
        T_image_conductor,
        T_image_image,
        T_image_image_spacing,
        T_image_outline_clearance,
        T_image_set,
        T_image_type,
        T_inch,
        T_include,
        T_include_pins_in_crosstalk,
        T_inductance_resolution,
        T_insert,
        T_instcnfg,
        T_inter_layer_clearance,
        T_jumper,
        T_junction_type,
        T_keepout,
        T_kg,
        T_kohm,
        T_large,
        T_large_large,
        T_layer,
        T_layer_depth,
        T_layer_noise_weight,
        T_layer_pair,
        T_layer_rule,
        T_length,
        T_length_amplitude,
        T_length_factor,
        T_length_gap,
        T_library,
        T_library_out,
        T_limit,
        T_limit_bends,
        T_limit_crossing,
        T_limit_vias,
        T_limit_way,
        T_linear,
        T_linear_interpolation,
        T_load,
        T_lock_type,
        T_logical_part,
        T_logical_part_mapping,
        T_low,
        T_match_fromto_delay,
        T_match_fromto_length,
        T_match_group_delay,
        T_match_group_length,
        T_match_net_delay,
        T_match_net_length,
        T_max_delay,
        T_max_len,
        T_max_length,
        T_max_noise,
        T_max_restricted_layer_length,
        T_max_stagger,
        T_max_stub,
        T_max_total_delay,
        T_max_total_length,
        T_max_total_vias,
        T_medium,
        T_mhenry,
        T_mho,
        T_microvia,
        T_mid_driven,
        T_mil,
        T_min_gap,
        T_mirror,
        T_mirror_first,
        T_mixed,
        T_mm,
        T_negative_diagonal,
        T_net,
        T_net_number,
        T_net_out,
        T_net_pin_changes,
        T_nets,
        T_network,
        T_network_out,
        T_no,
        T_noexpose,
        T_noise_accumulation,
        T_noise_calculation,
        T_normal,
        T_object_type,
        T_off,
        T_off_grid,
        T_offset,
        T_on,
        T_open,
        T_opposite_side,
        T_order,
        T_orthogonal,
        T_outline,
        T_overlap,
        T_pad,
        T_pad_pad,
        T_padstack,
        T_pair,
        T_parallel,
        T_parallel_noise,
        T_parallel_segment,
        T_parser,
        T_part_library,
        T_path,
        T_pcb,
        T_permit_orient,
        T_permit_side,
        T_physical,
        T_physical_part_mapping,
        T_piggyback,
        T_pin,
        T_pin_allow,
        T_pin_cap_via,
        T_pin_via_cap,
        T_pin_width_taper,
        T_pins,
        T_pintype,
        T_place,
        T_place_boundary,
        T_place_control,
        T_place_keepout,
        T_place_rule,
        T_placement,
        T_plan,
        T_plane,
        T_pn,
        T_point,
        T_polygon,
        T_polyline_path,
        T_position,
        T_positive_diagonal,
        T_power,
        T_power_dissipation,
        T_power_fanout,
        T_prefix,
        T_primary,
        T_priority,
        T_property,
        T_protect,
        T_qarc,
        T_quarter,
        T_radius,
        T_ratio,
        T_ratio_tolerance,
        T_rect,
        T_reduced,
        T_region,
        T_region_class,
        T_region_class_class,
        T_region_net,
        T_relative_delay,
        T_relative_group_delay,
        T_relative_group_length,
        T_relative_length,
        T_reorder,
        T_reroute_order_viols,
        T_resistance_resolution,
        T_resistor,
        T_resolution,
        T_restricted_layer_length_factor,
        T_room,
        T_rotate,
        T_rotate_first,
        T_round,
        T_roundoff_rotation,
        T_route,
        T_route_to_fanout_only,
        T_routes        T_absolute = 0,
,
        T_routes_include        T_add_group,
,
        T_rule,
        T_add_pins        T_same_net_checking,
,
        T_added        T_sample_window,
,
        T_allow_antenna        T_saturation_length,
,
        T_sec        T_allow_redundant_wiring,
,
        T_secondary        T_amp,
,
        T_self        T_ancestor,
,
        T_sequence_number,
        T_antipad        T_session,
,
        T_aperture_type        T_set_color,
,
        T_set_pattern        T_array,
,
        T_shape,
        T_attach        T_shield,
,
        T_shield_gap        T_attr,
,
        T_shield_loop,
        T_average_pair_length        T_shield_tie_down_interval,
,
        T_shield_width        T_back,
        T_side,
,
        T_base_design        T_signal,
,
        T_site,
        T_bbv_ctr2ctr        T_small,
,
        T_smd        T_bend_keepout,
,
        T_snap,
        T_bond        T_snap_angle,
,
        T_soft        T_both,
,
        T_source,
        T_bottom        T_space_in_quoted_tokens,
,
        T_spacing        T_bottom_layer_sel,
,
        T_spare,
        T_boundary        T_spiral_via,
,
        T_square        T_brickpat,
        T_stack_via,
,
        T_bundle        T_stack_via_depth,
,
        T_standard        T_bus,
        T_starburst,
,
        T_bypass        T_status,
,
        T_structure        T_capacitance_resolution,
        T_structure_out,
,
        T_capacitor        T_subgate,
,
        T_subgates,
        T_case_sensitive        T_substituted,
,
        T_such        T_cct1,
,
        T_suffix,
        T_cct1a        T_super_placement,
,
        T_supply        T_center_center,
,
        T_supply_pin,
        T_checking_trim_by_pin        T_swapping,
,
        T_switch_window        T_circ,
,
        T_system,
        T_circle        T_tandem_noise,
,
        T_tandem_segment        T_circuit,
,
        T_tandem_shield_overhang,
        T_class        T_term_only,
,
        T_terminal        T_class_class,
,
        T_terminator        T_classes,
        T_test,
,
        T_clear        T_test_points,
,
        T_testpoint        T_clearance,
        T_threshold,
,
        T_cluster        T_time_length_factor,
,
        T_time_resolution,
        T_cm        T_tjunction,
,
        T_tolerance        T_color,
,
        T_top,
        T_colors        T_topology,
,
        T_total        T_comment,
,
        T_track_id,
        T_comp        T_turret,
,
        T_type        T_comp_edge_center,
,
        T_um,
        T_comp_order        T_unassigned,
,
        T_unconnects        T_component,
,
        T_unit,
        T_composite        T_up,
,
        T_use_array        T_conductance_resolution,
        T_use_layer,
,
        T_conductor        T_use_net,
,
        T_use_via        T_conflict,
        T_value,
,
        T_connect        T_vertical,
,
        T_via        T_constant,
        T_via_array_template,
,
        T_via_at_smd        T_contact,
,
        T_via_keepout,
        T_control        T_via_number,
,
        T_via_rotate_first        T_corner,
,
        T_via_site,
        T_corners        T_via_size,
,
        T_virtual_pin        T_cost,
,
        T_volt,
        T_created_time        T_voltage_resolution,
,
        T_was_is        T_cross,
,
        T_way        T_crosstalk_model,
        T_weight,
,
        T_width        T_current_resolution,
,
        T_window,
        T_deleted        T_wire,
,
        T_wire_keepout        T_deleted_keepout,
,
        T_wires,
        T_delta        T_wires_include,
,
        T_wiring        T_diagonal,
        T_write_resolution,
,
        T_direction        T_x,
,
        T_directory        T_xy,
,
        T_discrete        T_y,

        T_effective_via_length,
        T_elongate_keepout,
        T_exclude,
        T_expose,
        T_extra_image_directory,
        T_family,
        T_family_family,
        T_family_family_spacing,
        T_fanout,
        T_farad,
        T_file,
        T_fit,
        T_fix,
        T_flip_style,
        T_floor_plan,
        T_footprint,
        T_forbidden,
        T_force_to_terminal_point,
        T_forgotten,
        T_free,
        T_fromto,
        T_front,
    };
}   // namespace DSN


/**
 * Class SPECCTRA_LEXER
 * is an automatically generated class using the TokenList2DnsLexer.cmake
 * technology, based on keywords provided by file:
 *    /builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra.keywords
 */
class SPECCTRA_LEXER : public DSNLEXER
{
    /// Auto generated lexer keywords table and length:
    static const KEYWORD  keywords[];
    static const unsigned keyword_count;

public:
    /**
     * Constructor ( const std::string&, const wxString& )
     * @param aSExpression is (utf8) text possibly from the clipboard that you want to parse.
     * @param aSource is a description of the origin of @a aSExpression, such as a filename.
     *   If left empty, then _("clipboard") is used.
     */
    SPECCTRA_LEXER( const std::string& aSExpression, const wxString& aSource = wxEmptyString ) :
        DSNLEXER( keywords, keyword_count, aSExpression, aSource )
    {
    }

    /**
     * Constructor ( FILE* )
     * takes @a aFile already opened for reading and @a aFilename as parameters.
     * The opened file is assumed to be positioned at the beginning of the file
     * for purposes of accurate line number reporting in error messages.  The
     * FILE is closed by this instance when its destructor is called.
     * @param aFile is a FILE already opened for reading.
     * @param aFilename is the name of the opened file, needed for error reporting.
     */
    SPECCTRA_LEXER( FILE* aFile, const wxString& aFilename ) :
        DSNLEXER( keywords, keyword_count, aFile, aFilename )
    {
    }

    /**
     * Constructor ( LINE_READER* )
     * intializes a lexer and prepares to read from @a aLineReader which
     * is assumed ready, and may be in use by other DSNLEXERs also.  No ownership
     * is taken of @a aLineReader. This enables it to be used by other lexers also.
     * The transition between grammars in such a case, must happen on a text
     * line boundary, not within the same line of text.
     *
     * @param aLineReader is any subclassed instance of LINE_READER, such as
     *  STRING_LINE_READER or FILE_LINE_READER.  No ownership is taken of aLineReader.
     */
    SPECCTRA_LEXER( LINE_READER* aLineReader ) :
        DSNLEXER( keywords, keyword_count, aLineReader )
    {
    }

    /**
     * Function TokenName
     * returns the name of the token in ASCII form.
     */
    static const char* TokenName( DSN::T aTok );

    /**
     * Function NextTok
     * returns the next token found in the input file or T_EOF when reaching
     * the end of file.  Users should wrap this function to return an enum
     * to aid in grammar debugging while running under a debugger, but leave
     * this lower level function returning an int (so the enum does not collide
     * with another usage).
     * @return DSN::T - the type of token found next.
     * @throw IO_ERROR - only if the LINE_READER throws it.
     */
    DSN::T NextTok()
    {
        return (DSN::T) DSNLEXER::NextTok();
    }

    /**
     * Function NeedSYMBOL
     * calls NextTok() and then verifies that the token read in
     * satisfies bool IsSymbol().
     * If not, an IO_ERROR is thrown.
     * @return int - the actual token read in.
     * @throw IO_ERROR, if the next token does not satisfy IsSymbol()
     */
    DSN::T NeedSYMBOL()
    {
        return (DSN::T) DSNLEXER::NeedSYMBOL();
    }

    /**
     * Function NeedSYMBOLorNUMBER
     * calls NextTok() and then verifies that the token read in
     * satisfies bool IsSymbol() or tok==T_NUMBER.
     * If not, an IO_ERROR is thrown.
     * @return int - the actual token read in.
     * @throw IO_ERROR, if the next token does not satisfy the above test
     */
    DSN::T NeedSYMBOLorNUMBER()
    {
        return (DSN::T) DSNLEXER::NeedSYMBOLorNUMBER();
    }

    /**
     * Function CurTok
     * returns whatever NextTok() returned the last time it was called.
     */
    DSN::T CurTok()
    {
        return (DSN::T) DSNLEXER::CurTok();
    }

    /**
     * Function PrevTok
     * returns whatever NextTok() returned the 2nd to last time it was called.
     */
    DSN::T PrevTok()
    {
        return (DSN::T) DSNLEXER::PrevTok();
    }
};

// example usage

/**
 * Class _PARSER
 * holds data and functions pertinent to parsing a S-expression file .
 *
class SPECCTRA_PARSER : public SPECCTRA_LEXER
{

};
*/

#endif   // SPECCTRA_LEXER_H_
        T_front_only,
        T_gap,
        T_gate,
        T_gates,
        T_generated_by_freeroute,
        T_global,
        T_grid,
        T_group,
        T_group_set,
        T_guide,
        T_hard,
        T_height,
        T_high,
        T_history,
        T_horizontal,
        T_host_cad,
        T_host_version,
        T_image,
        T_image_conductor,
        T_image_image,
        T_image_image_spacing,
        T_image_outline_clearance,
        T_image_set,
        T_image_type,
        T_inch,
        T_include,
        T_include_pins_in_crosstalk,
        T_inductance_resolution,
        T_insert,
        T_instcnfg,
        T_inter_layer_clearance,
        T_jumper,
        T_junction_type,
        T_keepout,
        T_kg,
        T_kohm,
        T_large,
        T_large_large,
        T_layer,
        T_layer_depth,
        T_layer_noise_weight,
        T_layer_pair,
        T_layer_rule,
        T_length,
        T_length_amplitude,
        T_length_factor,
        T_length_gap,
        T_library,
        T_library_out,
        T_limit,
        T_limit_bends,
        T_limit_crossing,
        T_limit_vias,
        T_limit_way,
        T_linear,
        T_linear_interpolation,
        T_load,
        T_lock_type,
        T_logical_part,
        T_logical_part_mapping,
        T_low,
        T_match_fromto_delay,
        T_match_fromto_length,
        T_match_group_delay,
        T_match_group_length,
        T_match_net_delay,
        T_match_net_length,
        T_max_delay,
        T_max_len,
        T_max_length,
        T_max_noise,
        T_max_restricted_layer_length,
        T_max_stagger,
        T_max_stub,
        T_max_total_delay,
        T_max_total_length,
        T_max_total_vias,
        T_medium,
        T_mhenry,
        T_mho,
        T_microvia,
        T_mid_driven,
        T_mil,
        T_min_gap,
        T_mirror,
        T_mirror_first,
        T_mixed,
        T_mm,
        T_negative_diagonal,
        T_net,
        T_net_number,
        T_net_out,
        T_net_pin_changes,
        T_nets,
        T_network,
        T_network_out,
        T_no,
        T_noexpose,
        T_noise_accumulation,
        T_noise_calculation,
        T_normal,
        T_object_type,
        T_off,
        T_off_grid,
        T_offset,
        T_on,
        T_open,
        T_opposite_side,
        T_order,
        T_orthogonal,
        T_outline,
        T_overlap,
        T_pad,
        T_pad_pad,
        T_padstack,
        T_pair,
        T_parallel,
        T_parallel_noise,
        T_parallel_segment,
        T_parser,
        T_part_library,
        T_path,
        T_pcb,
        T_permit_orient,
        T_permit_side,
        T_physical,
        T_physical_part_mapping,
        T_piggyback,
        T_pin,
        T_pin_allow,
        T_pin_cap_via,
        T_pin_via_cap,
        T_pin_width_taper,
        T_pins,
        T_pintype,
        T_place,
        T_place_boundary,
        T_place_control,
        T_place_keepout,
        T_place_rule,
        T_placement,
        T_plan,
        T_plane,
        T_pn,
        T_point,
        T_polygon,
        T_polyline_path,
        T_position,
        T_positive_diagonal,
        T_power,
        T_power_dissipation,
        T_power_fanout,
        T_prefix,
        T_primary,
        T_priority,
        T_property,
        T_protect,
        T_qarc,
        T_quarter,
        T_radius,
        T_ratio,
        T_ratio_tolerance,
        T_rect,
        T_reduced,
        T_region,
        T_region_class,
        T_region_class_class,
        T_region_net,
        T_relative_delay,
        T_relative_group_delay,
        T_relative_group_length,
        T_relative_length,
        T_reorder,
        T_reroute_order_viols,
        T_resistance_resolution,
        T_resistor,
        T_resolution,
        T_restricted_layer_length_factor,
        T_room,
        T_rotate,
        T_rotate_first,
        T_round,
        T_roundoff_rotation,
        T_route,
        T_route_to_fanout_only,
        T_routes,
        T_routes_include,
        T_rule,
        T_same_net_checking,
        T_sample_window,
        T_saturation_length,
        T_sec,
        T_secondary,
        T_self,
        T_sequence_number,
        T_session,
        T_set_color,
        T_set_pattern,
        T_shape,
        T_shield,
        T_shield_gap,
        T_shield_loop,
        T_shield_tie_down_interval,
        T_shield_width,
        T_side,
        T_signal,
        T_site,
        T_small,
        T_smd,
        T_snap,
        T_snap_angle,
        T_soft,
        T_source,
        T_space_in_quoted_tokens,
        T_spacing,
        T_spare,
        T_spiral_via,
        T_square,
        T_stack_via,
        T_stack_via_depth,
        T_standard,
        T_starburst,
        T_status,
        T_structure,
        T_structure_out,
        T_subgate,
        T_subgates,
        T_substituted,
        T_such,
        T_suffix,
        T_super_placement,
        T_supply,
        T_supply_pin,
        T_swapping,
        T_switch_window,
        T_system,
        T_tandem_noise,
        T_tandem_segment,
        T_tandem_shield_overhang,
        T_term_only,
        T_terminal,
        T_terminator,
        T_test,
        T_test_points,
        T_testpoint,
        T_threshold,
        T_time_length_factor,
        T_time_resolution,
        T_tjunction,
        T_tolerance,
        T_top,
        T_topology,
        T_total,
        T_track_id,
        T_turret,
        T_type,
        T_um,
        T_unassigned,
        T_unconnects,
        T_unit,
        T_up,
        T_use_array,
        T_use_layer,
        T_use_net,
        T_use_via,
        T_value,
        T_vertical,
        T_via,
        T_via_array_template,
        T_via_at_smd,
        T_via_keepout,
        T_via_number,
        T_via_rotate_first,
        T_via_site,
        T_via_size,
        T_virtual_pin,
        T_volt,
        T_voltage_resolution,
        T_was_is,
        T_way,
        T_weight,
        T_width,
        T_window,
        T_wire,
        T_wire_keepout,
        T_wires,
        T_wires_include,
        T_wiring,
        T_write_resolution,
        T_x,
        T_xy,
        T_y
    };
}   // namespace DSN


/**
 * Class SPECCTRA_LEXER
 * is an automatically generated class using the TokenList2DnsLexer.cmake
 * technology, based on keywords provided by file:
 *    /builddir/build/BUILD/kicad-r12311-218f66a0/pcbnew/specctra_import_export/specctra.keywords
 */
class SPECCTRA_LEXER : public DSNLEXER
{
    /// Auto generated lexer keywords table and length:
    static const KEYWORD  keywords[];
    static const unsigned keyword_count;

public:
    /**
     * Constructor ( const std::string&, const wxString& )
     * @param aSExpression is (utf8) text possibly from the clipboard that you want to parse.
     * @param aSource is a description of the origin of @a aSExpression, such as a filename.
     *   If left empty, then _("clipboard") is used.
     */
    SPECCTRA_LEXER( const std::string& aSExpression, const wxString& aSource = wxEmptyString ) :
        DSNLEXER( keywords, keyword_count, aSExpression, aSource )
    {
    }

    /**
     * Constructor ( FILE* )
     * takes @a aFile already opened for reading and @a aFilename as parameters.
     * The opened file is assumed to be positioned at the beginning of the file
     * for purposes of accurate line number reporting in error messages.  The
     * FILE is closed by this instance when its destructor is called.
     * @param aFile is a FILE already opened for reading.
     * @param aFilename is the name of the opened file, needed for error reporting.
     */
    SPECCTRA_LEXER( FILE* aFile, const wxString& aFilename ) :
        DSNLEXER( keywords, keyword_count, aFile, aFilename )
    {
    }

    /**
     * Constructor ( LINE_READER* )
     * intializes a lexer and prepares to read from @a aLineReader which
     * is assumed ready, and may be in use by other DSNLEXERs also.  No ownership
     * is taken of @a aLineReader. This enables it to be used by other lexers also.
     * The transition between grammars in such a case, must happen on a text
     * line boundary, not within the same line of text.
     *
     * @param aLineReader is any subclassed instance of LINE_READER, such as
     *  STRING_LINE_READER or FILE_LINE_READER.  No ownership is taken of aLineReader.
     */
    SPECCTRA_LEXER( LINE_READER* aLineReader ) :
        DSNLEXER( keywords, keyword_count, aLineReader )
    {
    }

    /**
     * Function TokenName
     * returns the name of the token in ASCII form.
     */
    static const char* TokenName( DSN::T aTok );

    /**
     * Function NextTok
     * returns the next token found in the input file or T_EOF when reaching
     * the end of file.  Users should wrap this function to return an enum
     * to aid in grammar debugging while running under a debugger, but leave
     * this lower level function returning an int (so the enum does not collide
     * with another usage).
     * @return DSN::T - the type of token found next.
     * @throw IO_ERROR - only if the LINE_READER throws it.
     */
    DSN::T NextTok()
    {
        return (DSN::T) DSNLEXER::NextTok();
    }

    /**
     * Function NeedSYMBOL
     * calls NextTok() and then verifies that the token read in
     * satisfies bool IsSymbol().
     * If not, an IO_ERROR is thrown.
     * @return int - the actual token read in.
     * @throw IO_ERROR, if the next token does not satisfy IsSymbol()
     */
    DSN::T NeedSYMBOL()
    {
        return (DSN::T) DSNLEXER::NeedSYMBOL();
    }

    /**
     * Function NeedSYMBOLorNUMBER
     * calls NextTok() and then verifies that the token read in
     * satisfies bool IsSymbol() or tok==T_NUMBER.
     * If not, an IO_ERROR is thrown.
     * @return int - the actual token read in.
     * @throw IO_ERROR, if the next token does not satisfy the above test
     */
    DSN::T NeedSYMBOLorNUMBER()
    {
        return (DSN::T) DSNLEXER::NeedSYMBOLorNUMBER();
    }

    /**
     * Function CurTok
     * returns whatever NextTok() returned the last time it was called.
     */
    DSN::T CurTok()
    {
        return (DSN::T) DSNLEXER::CurTok();
    }

    /**
     * Function PrevTok
     * returns whatever NextTok() returned the 2nd to last time it was called.
     */
    DSN::T PrevTok()
    {
        return (DSN::T) DSNLEXER::PrevTok();
    }
};

// example usage

/**
 * Class _PARSER
 * holds data and functions pertinent to parsing a S-expression file .
 *
class SPECCTRA_PARSER : public SPECCTRA_LEXER
{

};
*/

#endif   // SPECCTRA_LEXER_H_

Follow ups