2017-04-15 94 views
0

我試圖用flex和野牛,使一個小的編譯器,但我沒有得到如何給行動爲每個規則如何給行動爲每個規則野牛

我的語法是這樣的:

 %union{ 
      std::string *s; 
    }; 

%start program 
%type <s> expr 

%token <s> KEYWORD 
%token <s> VARIABLE 

%% 

program : KEYWORD {std::cout << "A"; } 
| KEYWORD VARIABLE {std::cout << "B"; } 

可變正則表達式是〔A-ZA-Z0-9]

「帽」 是我的關鍵字

如果我給輸入爲 「大寫鎖定」(帽= KEYWORD和鎖= VARIABLE) 我是越來越outpu噸爲「B」

如果我給輸入作爲帽然後它等待,直到我進入下一字和輸入任何下一個字之後,如果下一個輸入是帽打印「Asyntax錯誤」。

問題是它會等待,直到下一個輸入是考慮到打印,它仍然打印出是否存在錯誤語法錯誤

我沒有得到什麼不對的地方有人可以發現其中的錯誤在裏面。

+1

所以,你得到一個印,但不是B?這意味着你將關鍵字識別爲東西,但顯然不是變量。這個問題不在語法中 - 它在詞法分析器中,你沒有顯示。您應該考慮在您的打印中添加換行符。 (這也很不尋常 - COBOL就像 - 使用'-'作爲變量名稱中的字符,你是否指'Z'和'0'之間的'_'?)你確定你可以打開詞法診斷打印分析器,所以你可以看到令牌流返回到語法?如果可以的話,它會使生活更容易。 –

+0

如何打開在柔性印刷診斷和我沒有在詞法分析器打印任何東西 –

+0

你必須提供在Flex代碼控制我如何添加一個換行符。它不是默認提供的。但是,能夠查看詞法分析器返回的內容通常可以幫助調試語法。 –

回答

1

野牛需要一個令牌「輸入的結束」來標記輸入的結束並返回一個成功的解析。通常情況下,您在閱讀EOF時將此標記賦予它(這是lex/flex將執行的操作)。所以,如果你輸入一個EOF(通常通過點擊CTRLdCTRLž)輸入之後,它應該工作。

+0

如何從像呼應的空間和新的生產線的非匹配的輸入停止野牛和爲什麼它只是回聲對於空格和換行符,併爲其他不匹配的ascii字符串提供語法錯誤。 –

+0

@JeevansaiJinne:野牛不會做無與倫比的輸入迴音;這是Flex的「工作」。它有一個默認的規則,回聲匹配的文本不被任何其他規則捕獲(大約'。+ {ECHO;}')。 –

+0

我怎麼野牛正在打印地址 –