2014-02-19 54 views
2

我想創建一個解析器 - 掃描儀將得到作爲輸入文件哪個文件有這樣的東西里面:5 + 23 + ..... + 3;,我希望它打印結果屏幕上。解析器和掃描儀爲x1 + x2 + ... + xn

我覺得有點難以理解$$ = $1 +...的工作方式,以及這些$1,$2與令牌是如何連接的。如果有人能向我解釋那部分,我會非常感激。

我的代碼到目前爲止是這樣的:

法代碼:

%option noyywrap 
%% 
\+ //{ yylval.p = yytext[0]; return PLUS; } 
; //{ yylval.q = yytext[0]; return Q_MARK; } 
0|([-+]?(([1-9][0-9]*)|(0\.[0-9]+)|([1-9][0-9]*\.[0-9]+))) { yylval.d = atof(yytext); return NUMBER; } 
%% 

Flex代碼:

%defines 

%{ 
#include <stdio.h> 
#include <stdlib.h> 
%} 

%union { 
    double d; 
    } 

%token <d> NUMBER //some number 
%token PLUS  // + 
%token Q_MARK  // ; 
%start addition_list 
%% 

addition_list : addition Q_MARK {} 
| addition_list addition Q_MARK {} 
; 

addition : NUMBER PLUS NUMBER { } 
| addition PLUS NUMBER { } 
; 

%% 
int yyerror(char *message) 
{ 
    return 0; 
} 
void main() 
{ 
    yyparse(); 
} 

PS:我已經在它應該如何看一些指令所以這就是爲什麼它是像那樣。無論你能給我什麼線索都會非常感激,因爲我發現它很難理解互聯網指南(儘管如此)。

回答

2

我不想太深入flex和野牛,所以我儘量簡單地解釋它。

$$罐解釋爲語法規則的返回值,一旦規則被finnished由解析器的$$值將通過給予(降低)。

因此,例如,規則:

addition : NUMBER PLUS NUMBER { } 

捲曲手鐲的內部被稱爲操作規則。 $1 $2 $3 ...表示規則的第一個,第二個和第三個參數。

這意味着:

$1 = NUMBER 
$2 = PLUS 
$3 = NUMBER 

如果你想將號碼添加到你寫這樣的事情在你的行動規則,對方號碼:

addition : NUMBER PLUS NUMBER { printf("%d",$1+$3);} 

詞法分析器是有點像解析器的子例程,解析器請求下一個符號,flex會掃描下一個符號的輸入並將其傳遞給野牛。

有些事情要提到:解析器不知道數字內部是什麼,他只是得到符號 NUMBER。爲什麼你需要像這樣在你的Flex /野牛這就是:

柔性文件:

[0-9]+ { yylval.val = atoi(yytext); return NUMBER; } 

野牛:

%union { 
int val; 
}; 
%token <val> NUMBER 

了一個號碼符號進行掃描,彎曲它的值寫入瓦爾因此野牛可以訪問它。

爲了更好地理解發生了什麼,我建議您在每個語法規則中都做一些printf。希望有所幫助!

+0

非常感謝您的回答...把它作爲指導,我會嘗試一些事情。如果你想回答的話,還有兩個簡單的問題。例如:NUMBER PLUS NUMBER printf工程,但是當我把這個{$$ = $ 1 + $ 3;}解析器拋出錯誤(我想做這樣的事情來得到結果)。第二,除了聲明終端(例如%token NUMBER)我是否還必須聲明非終端來實現我的目標? –

+0

這裏是一個flex和野牛計算器的例子。試着複製這個例子,並找出它的工作原理。如果你仍然有問題,你可以再問我一次:-) http://www.usna.edu/Users/cs/lmcdowel/courses/si413/F10/labs/L04/calc1/ex1.html – Amazonasmann

+0

對於你的語法規則,你需要做這樣的事情:%type addition_list addition – Amazonasmann