2009-11-17 24 views
0

確實在下面的文件中,INT是字面上的,而ID不是?你怎麼知道?如何判斷是否在yacc文件中字面解釋或不解釋?

/* 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 ; 

回答

3

通常情況下,yacc會逐字引用單引號字符,其他所有內容都會聲明爲生產或令牌。

在這種情況下,無論是INTID被聲明爲令牌所以一個假定它們將從詞法分析器與分配給全球yylval一個對應的語義值被返回。

有一個複雜的機制來處理多字符標記,但是這個語法沒有使用它。

+0

詞法分析器如何返回語義值?它會是什麼樣子? – neuromancer 2009-11-17 08:30:41

+0

一般來說,請參閱http://www.gnu.org/software/bison/manual/ 具體來說,ID和INT被聲明爲標記,所以yylex()必須返回它們。這個語法希望yylex()能夠識別關鍵字並將它們作爲記號返回。任何其他單詞都應該作爲ID返回。詞法分析器通過分配「yylval」來返回語義值。這對'ID'來說很重要,它可以是任何單詞,但代表特定符號(如您所說)的文字符號和關鍵字並不重要。 – DigitalRoss 2009-11-17 15:46:50