Software Engineering Institute Carnegie Mellon

Product Line Systems Program
Predictable Assembly from
Certifiable Components
PACC Technologies
Collaborations
Downloads
Publications
Glossary
Workshops and Conferences
Software Product Lines
Software Architecture

Copper Specification Grammar

Comments are C/C++ style

comment : /* ... */ | // ...

Basics

identifier : lower_id | upper_id | dummy_var

int_constant : integer constant

string_literal : string literal

lower_id : identifier beginning with lower-case letter

upper_id : identifier beginning with upper-case letter

dummy_var : dummy variable beginning with a "$"


Back To Top
 

Expressions

primary_expression
    : identifier
    | int_constant
    | string_literal
    | "(" expression ")"

postfix_expression
    : primary_expression
    | postfix_expression "[" expression "]"
    | postfix_expression "(" ")"
    | postfix_expression "(" argument_expression_list ")"
    | postfix_expression "." identifier
    | postfix_expression "->" identifier
    | postfix_expression "++"
    | postfix_expression "--"

argument_expression_list
    : assignment_expression
    | argument_expression_list "," assignment_expression

unary_expression
    : postfix_expression
    | "++" unary_expression
    | "--" unary_expression
    | unary_operator cast_expression
    | "sizeof" unary_expression
    | "sizeof" "(" type_name ")"

unary_operator  : "&" | "*" | "+" | "-" | "~" | "!"

cast_expression
    : unary_expression
    | "(" type_name ")" cast_expression
    | "(" type_name ")" list_initializer

multiplicative_expression
    : cast_expression
    | multiplicative_expression "*" cast_expression
    | multiplicative_expression "/" cast_expression
    | multiplicative_expression "%" cast_expression

additive_expression
    : multiplicative_expression
    | additive_expression "+" multiplicative_expression
    | additive_expression "-" multiplicative_expression

shift_expression
    : additive_expression
    | shift_expression "<<" additive_expression
    | shift_expression ">>" additive_expression

relational_expression
    : shift_expression { $$ = $1; }
    | relational_expression "<" shift_expression
    | relational_expression ">" shift_expression
    | relational_expression "<=" shift_expression
    | relational_expression ">=" shift_expression

equality_expression
    : relational_expression
    | equality_expression "==" relational_expression
    | equality_expression "!=" relational_expression

and_expression
    : equality_expression
    | and_expression "&" equality_expression

exclusive_or_expression
    : and_expression
    | exclusive_or_expression "^" and_expression

inclusive_or_expression
    : exclusive_or_expression
    | inclusive_or_expression "|" exclusive_or_expression

logical_and_expression
    : inclusive_or_expression
    | logical_and_expression "&&" inclusive_or_expression

logical_or_expression
    : logical_and_expression
    | logical_or_expression "||" logical_and_expression

conditional_expression
    : logical_or_expression
    | logical_or_expression "?" ":" conditional_expression
    | logical_or_expression "?" expression ":" conditional_expression

assignment_expression
    : conditional_expression
    | unary_expression assignment_operator assignment_expression

assignment_operator : "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|="

expression
    : assignment_expression
    | expression "," assignment_expression

constant_expression : conditional_expression


Back To Top
 

Additional Information About C Procedures

procedure_name : postfix_expression

component
    /*single name*/
    : procedure_name
    /*two names - second name to be substituted - ignore this for now*/
    | procedure_name "|" procedure_name

component_list
    /*name*/
    : component
    /*list*/
    | component_list "," component

inline_list
    /*name*/
    : procedure_name
    /*list*/
    | inline_list "," procedure_name

program_info
    : "program" component_list "{" program_decls "}"
    | "program" component_list "{" "}"

program_decls
    : program_decl
    | program_decls program_decl

program_decl
    : "specification" identifier "," "{" argument_expression_list "}" "," process_id ";"
    | "specification" identifier "," "{" argument_expression_list "}" "," ltl_formula_name ";"

procedure_info
    : "procedure" procedure_name "{" procedure_decls "}"
    | "procedure" procedure_name "{" "}"

procedure_decls
    /*pred*/
    : predicate_decl
    /*pred_list*/
    | procedure_decls predicate_decl
    /*fair_loop*/
    | fair_loop_decl
    /*fair_loop_list*/
    | procedure_decls fair_loop_decl
    /*aux*/
    | auxiliary_decl
    /*aux_list*/
    | procedure_decls auxiliary_decl
    /*inline*/
    | inline_decl
    /*inline_list*/
    | procedure_decls inline_decl
    /*alias*/
    | alias_decl
    /*alias_list*/
    | procedure_decls alias_decl
    /*abstract*/
    | abstract_decl
    /*abstract_list*/
    | procedure_decls abstract_decl
    /*context*/
    | context_decl
    /*context_list*/
    | procedure_decls context_decl

predicate_decl : "predicate" predicate_list ";"

fair_loop_decl : "fair_loop" predicate_list ";"

auxiliary_decl : "auxiliary" predicate_list ";"

predicate_list
    /*pred*/
    : conditional_expression
    /*list*/
    | predicate_list "," conditional_expression

inline_decl : "inline" inline_list ";"

alias_decl : "alias" alias_item_list ";"

alias_item_list
    : alias_item
    | alias_item_list "," alias_item

alias_item
    : "{" conditional_expression "," points_to_list "}"

points_to_list
    /*name*/
    : conditional_expression
    /*list*/
    | points_to_list "," conditional_expression

abstract_decl
    : "abstract" abstract_item_list ";"

abstract_item_list
    : abstract_item
    | abstract_item_list "," abstract_item

abstract_item
    : "{" conditional_expression "," process_id "}"

context_decl : "context" int_constant ";"


Back To Top
 

FSP Productions

process_id : upper_id

action_label
    /*id*/
    : lower_id
    /*normal return*/
    | "return" "{" conditional_expression "}"
    /*void return*/
    | "return" "{" "}"
    /*assign*/
    | "{" conditional_expression  "=" "[" conditional_expression "]" "}"
    /*broadcast*/
    | lower_id "!!" "[" predicate_list "]"
    /*void send*/
    | lower_id "!" "[" "]"
    /*send*/
    | lower_id "!" "[" predicate_list "]"
    /*void receive*/
    | lower_id "?" "[" "]"
    /*receive*/
    | lower_id "?" "[" predicate_list "]"

action_label_list
    : action_label
    | action_label_list "," action_label

action_labels
    /*action*/
    : action_label

process_definition
    : process_id "=" process_body "."
    | process_id "=" process_body "+" "{" action_label_list "}" "."

process_body
    /*local*/
    : local_process
    /*list*/
    | local_process "," local_process_defs

local_process_defs
    /*local*/
    : local_process_def
    /*list*/
    | local_process_defs "," local_process_def

local_process_def : process_id "=" local_process

local_process
    /*stop*/
    : "STOP"
    /*id*/
    | process_id
    /*choice*/
    | "(" process_choice ")"

process_choice
    /*action*/
    : action_prefix
    /*choice*/
    | process_choice "|" action_prefix

action_prefix : prefix_actions PTR_OP local_process

prefix_actions
    /*action*/
    : action_labels
    /*prefix*/
    | prefix_actions "->" action_labels

prop_label
    : process_id "=" "{" predicate_list "}" "{" predicate_list "}" ";"
    | process_id "=" "{" predicate_list "}" "{" "}" ";"
    | process_id "=" "{" "}" "{" predicate_list "}" ";"

fsp_definition
    /*process*/
    : process_definition
    /*propositional_labeling*/
    | prop_label


Back To Top

LTL Productions

ltl_formula_name : upper_id primary_ltl_formula
    : "[" conditional_expression "]"
    | action_label
    | "(" ltl_formula ")"

unary_ltl_formula
    : primary_ltl_formula
    | "!" unary_ltl_formula
    | "#X" unary_ltl_formula
    | "#G" unary_ltl_formula
    | "#F" unary_ltl_formula

and_ltl_formula
    : unary_ltl_formula
    | and_ltl_formula "&" unary_ltl_formula

or_ltl_formula
    : and_ltl_formula
    | or_ltl_formula "|" and_ltl_formula

until_ltl_formula
    : or_ltl_formula
    | until_ltl_formula "#U" or_ltl_formula

release_ltl_formula
    : until_ltl_formula
    | release_ltl_formula "#R" until_ltl_formula

implies_ltl_formula
    : release_ltl_formula
    | release_ltl_formula "=>" implies_ltl_formula

ltl_formula : implies_ltl_formula

ltl_formula_def : "ltl" ltl_formula_name "{" ltl_formula ";" "}"


Back To Top

Top-Level Specification Productions

ext_def_list
    /*fsp*/
    : fsp_definition
    /*list_fsp*/
    | ext_def_list fsp_definition
    /*ltl*/
    | ltl_formula_def
    /*list_ltl*/
    | ext_def_list ltl_formula_def
    /*program*/
    | program_info
    /*list_program*/
    | ext_def_list program_info
    /*procedure*/
    | procedure_info
    /*list_procedure*/
    | ext_def_list procedure_info

spec_translation_unit : ext_def_list


Back To Top