2016-02-23 64 views
0

所以我有一個包含空字符串的語法。語法是這樣的:ocamlyacc與空字符串

S->ε

S->表達;; S

當我運行我的解析器時,我收到錯誤「沒有更多的狀態丟棄」,因此我相信我不能正確表示空字符串。那麼我將如何去表示它,特別是在詞法分析器.mll文件中?

我知道我需要爲此制定一個規則,所以我認爲我有這個原因。這是我認爲它應該看起來像解析器.mly文件,不包括表達的東西。

s: 
| EMPTY_STRING   { [] } 
| expression SEMICOLON s { $1::$3 } 

回答

1

您正在考慮將epsilon作爲標記,但它不是標記。這是一個長度爲0的令牌序列。因爲那裏沒有令牌,所以它不是你的掃描器需要知道的東西。解析器需要知道它。

下面是一個語法像什麼,我想你想:

%token X 
%token SEMICOLON 
%token EOF 
%start main 
%type <char list> main 
%% 
main : 
    s EOF   { $1 } 

s : 
    | epsilon   { $1 } 
    | X SEMICOLON s { 'x' :: $3 } 

epsilon : 
        { [] } 

注意epsilon是一個非終端(不是令牌)。它的定義是一個空的符號序列。

+0

規則epsilon根本沒用。只要把...沒有。 – Drup

+0

感謝您的幫助。我發現我只是需要在我的語法中使用EOF來代替空字符串以便使其工作,因爲最後一個標記將是EOF。 –