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).
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).
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).
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).
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).