OurC grammar 程序辅导、辅导OurC grammar 编程

- 首页 >> 其他

OurC grammar

// the lexical part

%token  Identifier

%token  Constant   // e.g., 35, 35.67, 'a', "Hi, there", true, false

                  //       .35, 35., 0023

%token  INT     // int

%token  FLOAT   // float

%token  CHAR    // char

%token  BOOL    // bool

%token  STRING  // string

%token  VOID    // void

%token  IF      // if

%token  ELSE    // else

%token  WHILE   // while

%token  DO      // do

%token  RETURN  // return

%token  '('

%token  ')'

%token  '['

%token  ']'

%token  '{'

%token  '}'

%token  '+'

%token  '-'

%token  '*'

%token  '/'

%token  '%'

%token  '^'

%token  '>'

%token  '<'

%token  GE      // >=

%token  LE      // <=

%token  EQ      // ==

%token  NEQ     // !=

%token  '&'

%token  '|'

%token  '='

%token  '!'

%token  AND     // &&

%token  OR      // ||

%token  PE      // +=

%token  ME      // -=

%token  TE      // *=

%token  DE      // /=

%token  RE      // %=

%token  PP      // ++

%token  MM      // --

%token  RS      // >>

%token  LS      // <<

%token  ';'

%token  ','

%token  '?'

%token  ':'


/*

* (僅供參考) precedence (lower ones are given higher precedence) and associativity

*/


%left   ','

%right  '=' PE ME TE DE RE

%right  '?'+':'

%left   OR

%left   AND

%left   '|'

%left   '^'

%left   '&'

%left   EQ NEQ

%left   '<' '>' GE LE

%left   '+' '-'

%left   '*' '/' '%'

%right  PP MM sign       // sign is '+' or '-' or '!'

%%  // the syntactical part (in EBNF)


user_input

   : ( definition | statement ) { definition | statement }


definition

   :           VOID Identifier function_definition_without_ID

   | type_specifier Identifier function_definition_or_declarators


type_specifier

   : INT | CHAR | FLOAT | STRING | BOOL


function_definition_or_declarators

   : function_definition_without_ID

   | rest_of_declarators


rest_of_declarators

   : [ '[' Constant ']' ]

     { ',' Identifier [ '[' Constant ']' ] } ';'


function_definition_without_ID

   : '(' [ VOID | formal_parameter_list ] ')' compound_statement


formal_parameter_list

   : type_specifier [ '&' ] Identifier [ '[' Constant ']' ]

     { ',' type_specifier [ '&' ] Identifier [ '[' Constant ']' ] }


compound_statement

   : '{' { declaration | statement } '}'


declaration

   : type_specifier Identifier rest_of_declarators


statement

   : ';'     // the null statement

   | expression ';'  /* expression here should not be empty */

   | RETURN [ expression ] ';'

   | compound_statement

   | IF '(' expression ')' statement [ ELSE statement ]

   | WHILE '(' expression ')' statement

   | DO statement WHILE '(' expression ')' ';'

   

expression

   : basic_expression { ',' basic_expression }


basic_expression

   : Identifier rest_of_Identifier_started_basic_exp

   | ( PP | MM ) Identifier rest_of_PPMM_Identifier_started_basic_exp

   | sign { sign } signed_unary_exp romce_and_romloe

   | ( Constant | '(' expression ')' ) romce_and_romloe


rest_of_Identifier_started_basic_exp

   : [ '[' expression ']' ]

     ( assignment_operator basic_expression

       |

       [ PP | MM ] romce_and_romloe

     )

   | '(' [ actual_parameter_list ] ')' romce_and_romloe


rest_of_PPMM_Identifier_started_basic_exp

   : [ '[' expression ']' ] romce_and_romloe


sign

   : '+' | '-' | '!'


actual_parameter_list

   : basic_expression { ',' basic_expression }


assignment_operator

   : '=' | TE | DE | RE | PE | ME


rest_of_maybe_conditional_exp_and_rest_of_maybe_logical_OR_exp // 即romce_and_romloe

   : rest_of_maybe_logical_OR_exp [ '?' basic_expression ':' basic_expression ]


rest_of_maybe_logical_OR_exp

   : rest_of_maybe_logical_AND_exp { OR maybe_logical_AND_exp }


maybe_logical_AND_exp

   : maybe_bit_OR_exp { AND maybe_bit_OR_exp }

rest_of_maybe_logical_AND_exp

   : rest_of_maybe_bit_OR_exp { AND maybe_bit_OR_exp }


maybe_bit_OR_exp

   : maybe_bit_ex_OR_exp { '|' maybe_bit_ex_OR_exp }

rest_of_maybe_bit_OR_exp

   : rest_of_maybe_bit_ex_OR_exp { '|' maybe_bit_ex_OR_exp }


maybe_bit_ex_OR_exp

   : maybe_bit_AND_exp { '^' maybe_bit_AND_exp }

rest_of_maybe_bit_ex_OR_exp

   : rest_of_maybe_bit_AND_exp { '^' maybe_bit_AND_exp }


maybe_bit_AND_exp

   : maybe_equality_exp { '&' maybe_equality_exp }

rest_of_maybe_bit_AND_exp

   : rest_of_maybe_equality_exp { '&' maybe_equality_exp }


maybe_equality_exp

   : maybe_relational_exp

     { ( EQ | NEQ ) maybe_relational_exp}

rest_of_maybe_equality_exp

   : rest_of_maybe_relational_exp

     { ( EQ | NEQ ) maybe_relational_exp }


maybe_relational_exp

   : maybe_shift_exp

     { ( '<' | '>' | LE | GE ) maybe_shift_exp }

rest_of_maybe_relational_exp

   : rest_of_maybe_shift_exp

     { ( '<' | '>' | LE | GE ) maybe_shift_exp }


maybe_shift_exp

   : maybe_additive_exp { ( LS | RS ) maybe_additive_exp }

rest_of_maybe_shift_exp

   : rest_of_maybe_additive_exp { ( LS | RS ) maybe_additive_exp }


maybe_additive_exp

   : maybe_mult_exp { ( '+' | '-' ) maybe_mult_exp }

rest_of_maybe_additive_exp

   : rest_of_maybe_mult_exp { ( '+' | '-' ) maybe_mult_exp }


maybe_mult_exp

   : unary_exp rest_of_maybe_mult_exp

rest_of_maybe_mult_exp

   : { ( '*' | '/' | '%' ) unary_exp }  /* could be empty ! */


unary_exp

   : sign { sign } signed_unary_exp

   | unsigned_unary_exp

   | ( PP | MM ) Identifier [ '[' expression ']' ]


signed_unary_exp

   : Identifier [ '(' [ actual_parameter_list ] ')'

                  |

                  '[' expression ']'

                ]

   | Constant

   | '(' expression ')'


unsigned_unary_exp

   : Identifier [ '(' [ actual_parameter_list ] ')'

                  |

                  [ '[' expression ']' ] [ ( PP | MM ) ]

                ]

   | Constant

   | '(' expression ')'