2009-12-07 7 views
0

Je suis seulement capable de faire des fonctions à l'intérieur de la portée globale. Scope nesting signifie être capable de faire des fonctions dans les fonctions, non? Je ne suis pas capable de faire ça avec cette grammaire. C'est possible?Est-ce que cette grammaire autorise l'imbrication de portée?

/* C-Minus BNF Grammar */ 

%token ELSE 
%token IF 
%token INT 
%token RETURN 
%token VOID 
%token WHILE 

%token ID 
%token NUM 

%token LTE 
%token GTE 
%token EQUAL 
%token NOTEQUAL 
%% 

program : declaration_list ; 

declaration_list : declaration_list declaration | declaration ; 

declaration : var_declaration | fun_declaration ; 

var_declaration : type_specifier ID ';' 
       | type_specifier ID '[' NUM ']' ';' ; 

type_specifier : INT | VOID ; 

fun_declaration : type_specifier ID '(' params ')' compound_stmt ; 

params : param_list | VOID ; 

param_list : param_list ',' param 
      | param ; 

param : type_specifier ID | type_specifier ID '[' ']' ; 

compound_stmt : '{' local_declarations statement_list '}' ; 

local_declarations : local_declarations var_declaration 
        | /* empty */ ; 

statement_list : statement_list statement 
       | /* empty */ ; 

statement : expression_stmt 
      | compound_stmt 
      | selection_stmt 
      | iteration_stmt 
      | return_stmt ; 

expression_stmt : expression ';' 
       | ';' ; 

selection_stmt : IF '(' expression ')' statement 
       | IF '(' expression ')' statement ELSE statement ; 

iteration_stmt : WHILE '(' expression ')' statement ; 

return_stmt : RETURN ';' | RETURN expression ';' ; 

expression : var '=' expression | simple_expression ; 

var : ID | ID '[' expression ']' ; 

simple_expression : additive_expression relop additive_expression 
        | additive_expression ; 

relop : LTE | '<' | '>' | GTE | EQUAL | NOTEQUAL ; 

additive_expression : additive_expression addop term | term ; 

addop : '+' | '-' ; 

term : term mulop factor | factor ; 

mulop : '*' | '/' ; 

factor : '(' expression ')' | var | call | NUM ; 

call : ID '(' args ')' ; 

args : arg_list | /* empty */ ; 

arg_list : arg_list ',' expression | expression ; 

Répondre

1

En fait, une grammaire n'implique pas une portée. C'est de cette façon que vous traitez sémantiquement les symboles qui déterminent la portée. Cela dit, dans cette grammaire, il pourrait y avoir une portée globale et une portée introduite par une instruction composée. Dans la portée globale, vous pouvez déclarer des variables et des fonctions. Dans la portée de l'instruction composée, vous ne pouvez déclarer que des variables.

Si vous souhaitez prendre en charge les fonctions imbriquées, modifiez la grammaire pour autoriser les déclarations de fonction dans les instructions composées.

Questions connexes