2.1 Grammar of TERMITE terms

The following section gives a formal definition of the grammar of Termite terms as it is used by the program termite_lint which can be used to verify the validity of arbitrary terms.

termite ::=
    project.
project ::=
    project([source_file], default_annotation, analysis_info, file_info).
source_file ::=
    source_file(global, default_annotation, analysis_info, file_info).
initialized_name ::=
    initialized_name(initializer?, initialized_name_annotation,
                     analysis_info, file_info).

2.1.1 statements

statement ::=
    break_stmt
  | case_option_stmt
  | continue_stmt
  | declaration_statement
  | default_option_stmt
  | attribute_specification_statement
  | expr_statement
  | for_init_statement
  | goto_statement
  | implicit_statement
  | label_statement
  | null_statement
  | return_stmt
  | scope_statement.
break_stmt ::=
    break_stmt(default_annotation, analysis_info, file_info).
case_option_stmt ::=
    case_option_stmt(expression, statement, expression? /* key_range_end */,
                     default_annotation, analysis_info, file_info).
continue_stmt ::=
    continue_stmt(default_annotation, analysis_info, file_info).
declaration_statement ::=
    class_declaration
  | enum_declaration
  | function_declaration
  | function_parameter_list
  | pragma_declaration
  | program_header_statement
  | procedure_header_statement
  | typedef_declaration
  | variable_declaration
  | variable_definition.
class_declaration ::=
    class_declaration(class_definition?, class_declaration_annotation,
                      analysis_info, file_info).
enum_declaration ::=
    enum_declaration([initialized_name], enum_declaration_annotation,
                     analysis_info, file_info).
function_declaration ::=
    function_declaration(function_parameter_list, {null}, function_definition?,
                         function_declaration_annotation,
                         analysis_info, file_info).
function_parameter_list ::=
    function_parameter_list([initialized_name],
                            default_annotation, analysis_info, file_info).
member_function_declaration ::=
    member_function_declaration(function_parameter_list, {null}, function_definition?,
				todo /* ctor_initializer_list */,
				member_function_declaration_annotation,
				analysis_info, file_info).
program_header_statement ::=
    program_header_statement(function_parameter_list, {null}, function_definition?,
			     function_declaration_annotation,
			     analysis_info, file_info).
procedure_header_statement ::=
    procedure_header_statement(function_parameter_list, {null}, function_definition?,
			       initialized_name,
			       procedure_header_statement_annotation,
			       analysis_info, file_info).
pragma_declaration ::=
    pragma_declaration(todo).
typedef_declaration ::=
    typedef_declaration(declaration_statement? /* base type definition */,
                        typedef_annotation, analysis_info, file_info).
variable_declaration ::=
    variable_declaration([initialized_name], variable_declaration_specific,
                         analysis_info, file_info).
variable_definition ::=
    variable_definition(todo).
default_option_stmt ::=
    default_option_stmt(statement,
                        default_annotation, analysis_info, file_info).
attribute_specification_statement ::=
    attribute_specification_statement(attribute_specification_statement_annotation, analysis_info, file_info).
attribute_specification_statement_annotation ::=
    attribute_specification_statement_annotation(todo /* kind */,
						 expr_list_exp,
						 todo /* bind list */,
						 preprocessing_info).
expr_statement ::=
    expr_statement(expression, default_annotation, analysis_info, file_info).
for_init_statement ::=
    for_init_statement([statement],
                       default_annotation, analysis_info, file_info).
goto_statement ::=
    goto_statement(label_annotation, analysis_info, file_info).
implicit_statement ::=
    implicit_statement(implicit_statement_annotation, analysis_info, file_info).
implicit_statement_annotation ::=
    implicit_statement_annotation(implicits, preprocessing_info).
implicits ::= atoms [implicit_none].
label_statement ::=
    label_statement(label_annotation, analysis_info, file_info).
null_statement ::=
    null_statement(default_annotation, analysis_info, file_info). /* really? */
return_stmt ::=
    return_stmt(expression, default_annotation, analysis_info, file_info).
scope_statement ::=
    basic_block
  | class_definition
  | do_while_stmt
  | for_statement
  | function_definition
  | global
  | if_stmt
  | switch_statement
  | while_stmt.
basic_block ::=
    basic_block([statement], default_annotation, analysis_info, file_info).
class_definition ::=
    class_definition([class_decls],
		     class_definition_annotation,
                     analysis_info, file_info).
class_decls ::= variable_declaration|member_function_declaration.
do_while_stmt ::=
    do_while_stmt(statement /* body */, statement /* condition */,
                  default_annotation, analysis_info, file_info).
for_statement ::=
    for_statement(for_init_statement, statement /* test */,
                  expression /* increment */, statement /* body */,
                  default_annotation, analysis_info, file_info).
function_definition ::=
    function_definition(basic_block,
                        default_annotation, analysis_info, file_info).
global ::=
    global([declaration_statement],
           default_annotation, analysis_info, file_info).
if_stmt ::=
    if_stmt(statement /* condition */, statement /* true */,
            statement? /* else */,
            default_annotation, analysis_info, file_info).
switch_statement ::=
    switch_statement(statement /* key */, statement /* body */,
                     default_annotation, analysis_info, file_info).
while_stmt ::=
    while_stmt(statement /* condition */, statement /* body */,
               default_annotation, analysis_info, file_info).

2.1.2 expressions

expression ::=
    binary_op
  | cast_exp(expression, /*expression? * original expression tree ,*/
             unary_op_annotation, analysis_info, file_info)
  | conditional_exp
  | expr_list_exp
  | function_call_exp
  | function_ref_exp
  | member_function_ref_exp
  | initializer
  | new_exp
  | delete_exp
  | null_expression
  | size_of_op
  | unary_op
  | var_arg_copy_op
  | var_arg_end_op
  | var_arg_op
  | var_arg_start_one_operand_op
  | var_arg_start_op
  | var_ref_exp
  | functors [long_long_int_val, unsigned_long_long_int_val, long_int_val,
        unsigned_long_val, int_val, unsigned_int_val, short_val,
        unsigned_short_val, char_val, unsigned_char_val, float_val,
        double_val, long_double_val, string_val, enum_val]
    with (/*expression?  original expression tree ,*/
          value_annotation, analysis_info, file_info).
binary_op ::=
    functors [add_op, and_assign_op, and_op, arrow_exp, assign_op,
        bit_and_op, bit_or_op, bit_xor_op, comma_op_exp, div_assign_op,
        divide_op, dot_exp, equality_op, greater_or_equal_op,
        greater_than_op, ior_assign_op, less_or_equal_op, less_than_op,
        lshift_assign_op, lshift_op, minus_assign_op, mod_assign_op, mod_op,
        mult_assign_op, multiply_op, not_equal_op, or_op, plus_assign_op,
        pntr_arr_ref_exp, rshift_assign_op, rshift_op, subtract_op,
        xor_assign_op]
    with (expression /* lhs */, expression /* rhs */,
          binary_op_annotation, analysis_info, file_info).
conditional_exp ::=
    conditional_exp(expression /* condition */,
                    expression /* true */, expression /* false */,
                    conditional_exp_annotation, analysis_info, file_info).
expr_list_exp ::=
    expr_list_exp([expression], default_annotation, analysis_info, file_info).
function_call_exp ::=
    function_call_exp(expression /* function */, expr_list_exp /* args */,
                      function_call_exp_annotation, analysis_info, file_info).
function_ref_exp ::=
    function_ref_exp(function_ref_exp_annotation, analysis_info, file_info).
member_function_ref_exp ::=
    member_function_ref_exp(member_function_ref_exp_annotation, analysis_info, file_info).
new_exp ::=
    new_exp({null}, constructor_initializer?, {null},
	    new_exp_annotation, analysis_info, file_info).
new_exp_annotation ::=
    new_exp_annotation(type, preprocessing_info).
delete_exp ::=
    delete_exp(var_ref_exp, delete_exp_annotation, analysis_info, file_info).
delete_exp_annotation ::=
    delete_exp_annotation(todo, todo, preprocessing_info).
constructor_initializer ::=
    constructor_initializer(expr_list_exp,
			    constructor_initializer_annotation,
			    analysis_info, file_info).
constructor_initializer_annotation ::=
    constructor_initializer_annotation(name, type,
				       name, name, name, name,
				       preprocessing_info).
initializer ::=
    aggregate_initializer
  | assign_initializer
  | constructor_initializer.
aggregate_initializer ::=
    aggregate_initializer(expr_list_exp,
                          default_annotation, analysis_info, file_info).
assign_initializer ::=
    assign_initializer(expression, assign_initializer_annotation,
                       analysis_info, file_info).
null_expression ::=
    null_expression(default_annotation, analysis_info, file_info).
size_of_op ::=
    size_of_op(expression?, size_of_op_annotation, analysis_info, file_info).
unary_op ::=
    functors [address_of_op, bit_complement_op, minus_minus_op,
        minus_op, not_op, plus_plus_op, pointer_deref_exp, unary_add_op]
    with (expression, unary_op_annotation, analysis_info, file_info).
var_arg_copy_op ::=
    var_arg_copy_op(todo).
var_arg_end_op ::=
    var_arg_end_op(todo).
var_arg_op ::=
    var_arg_op(todo).
var_arg_start_one_operand_op ::=
    var_arg_start_one_operand_op(todo).
var_arg_start_op ::=
    var_arg_start_op(todo).
var_ref_exp ::=
    var_ref_exp(var_ref_exp_annotation, analysis_info, file_info).

2.1.3 annotations

default_annotation ::=
    default_annotation({null})
  | default_annotation({null}, preprocessing_info).
initialized_name_annotation ::=
    initialized_name_annotation(type, name, todo /* storage modifier */,
                                scope_name?, preprocessing_info).
function_declaration_annotation ::=
    function_declaration_annotation(type, name, declaration_modifier, todo /* special */,
                                    preprocessing_info).
member_function_declaration_annotation ::=
    member_function_declaration_annotation(some_function_type, name, scope_name,
					   declaration_modifier, todo /* special */,
					   preprocessing_info).
some_function_type ::= member_function_type | function_type /* static */.
member_function_type ::=
    member_function_type(type /* return */, todo /* ellipses */, [type] /* args */, todo).
procedure_header_statement_annotation ::=
    procedure_header_statement_annotation(type, name, declaration_modifier,
					  todo /* subprogram kinds */,
					  todo, preprocessing_info).
class_declaration_annotation ::=
    class_declaration_annotation(name, todo /* class kind */, type,
                                 preprocessing_info).
enum_declaration_annotation ::=
    enum_declaration_annotation(name, todo, todo, preprocessing_info).
class_definition_annotation ::=
    class_definition_annotation(todo /* inheritances */, file_info, preprocessing_info).
variable_declaration_specific ::=
    variable_declaration_specific(todo /* declaration modifier */,
                                  declaration_statement? /* base type decl */,
                                  preprocessing_info).
label_annotation ::=
    label_annotation(name, preprocessing_info).
size_of_op_annotation ::=
    size_of_op_annotation(type? /* operand */, type /* sizeof expression */,
                          preprocessing_info).
value_annotation ::=
    value_annotation(number_or_string, name, type, preprocessing_info) /* enum */
    | value_annotation(number_or_string, preprocessing_info).
binary_op_annotation ::=
    binary_op_annotation(type, preprocessing_info).
unary_op_annotation ::=
    unary_op_annotation(fixity, type, todo /* cast type */,
                        todo /* throw kind */, preprocessing_info).
var_ref_exp_annotation ::=
    var_ref_exp_annotation(type, name, todo /* storage modifier */,
                           scope_name?, preprocessing_info).
typedef_annotation ::=
    typedef_annotation(name, type, preprocessing_info).
function_ref_exp_annotation ::=
    function_ref_exp_annotation(name, type, preprocessing_info).
member_function_ref_exp_annotation ::=
    member_function_ref_exp_annotation(name, number_or_string, member_function_type,
				       number_or_string, preprocessing_info).
function_call_exp_annotation ::=
    function_call_exp_annotation(type, preprocessing_info).
assign_initializer_annotation ::=
    assign_initializer_annotation(type, preprocessing_info).
conditional_exp_annotation ::=
    conditional_exp_annotation(type, preprocessing_info).

2.1.4 other stuff

analysis_info ::=
    analysis_info([_]).
file_info ::=
    file_info({_}, {_}, {_}).
preprocessing_info ::=
    preprocessing_info([_]).
type ::=
    basic_type
  | array_type(type, expression?, number_or_string /* rank */, expr_list_exp?)
  | function_type
  | member_function_type
  | modifier_type(type, type_modifier)
  | named_type
  | type_default
  | pointer_type(type).
function_type ::= function_type(type /* return */, todo /* ellipses */, [type] /* args */).
basic_type ::=
    atoms [type_bool, type_char, type_double, type_ellipse, type_float,
        type_int, type_long, type_long_double, type_long_long, type_short,
        type_signed_char, type_string, type_unsigned_char,
        type_unsigned_int, type_unsigned_long, type_unsigned_long_long,
        type_unsigned_short, type_void].
type_default ::= atoms [type_default].
named_type ::=
    class_type(name, todo, todo)
  | enum_type(todo)
  | typedef_type(name, type).
type_modifier ::=
    type_modifier([todo], todo, todo, todo).
name ::=
    {Name} where atom(Name).
scope_name ::=  % name of a scope
  {::}
  | class_scope(name, class_kind, preprocessing_info)
  | name.
class_kind ::=
    {class}
  | {struct}
  | {union}.
number_or_string ::=
    {It} where ( numberatom(It) ; number(It) ; string(It) ; atom(It) ).
fixity ::=  % fixity of unary operators
    {prefix}
  | {postfix}.
declaration_modifier ::=
    declaration_modifier(todo, todo, todo, todo).
todo ::=
    {_}.
For an optional argument A? , this predicate is tried first.
missing(null).
Test whether the atom A can be interpreted as a number.
numberatom(A) :-
    atom(A),
    catch(atom_number(A, _N), _, fail).