2014-02-12 22 views
3

我想用wxWidgets作爲我的GUI編寫一個簡單的Lua解釋器。我正在閱讀多行文本框中的Lua命令。這裏是我的代碼:嵌入在wxWidgets中的一個簡單的Lua解釋器

wxString cmdStr = m_OutputWindow->GetLineText(line-1); //Read text 

    const char* commandStr=(const char*)cmdStr.mb_str(); 
    int err=luaL_loadbuffer(luastate,commandStr,strlen(commandStr),"line")||lua_pcall(luastate, 0, 0, 0); 
    wxString outputstr; 
    if(err) 
    { 
     outputstr=wxString::FromUTF8(lua_tostring(luastate,-1)); 
     lua_pop(luastate, 1); 
    } 

如果我試圖評估像3 + 5,然後我得到以下錯誤

[string "line"]:1: syntax error near <eof> 

知道的任何想法的簡單表達。

+2

'3 + 5'不是有效的Lua語句,它是一個表達式。試試類似'print(3 + 5)'的東西。 http://lua-users.org/wiki/ExpressionsAsStatements – Roddy

+1

或'return 3 + 5'。 – lhf

+0

如果我給出命令:print(3 + 5),則出現以下錯誤 [string「line」]:1:char(236) – macroland

回答

2

如果你希望用戶給它解釋之前輸入表達式(如1+2a+math.sqrt(b)),你必須在前面加上「回報」給它:

const std::string cmdStr = "return " + m_OutputWindow->GetLineText(line-1).ToStdString(); 
int err = luaL_loadbuffer(luastate, cmdStr.c_str() , cmdStr.size(), "line") 
     || lua_pcall(luastate, 0, 0, 0); 

然而,你可能不希望如果用戶輸入語句(如a=1; b=2),則預先設置它。由於您正在閱讀多行文本代碼,因此您可能會得到由換行符分隔的一串語句。在這種情況下,你不應該預先返回;你的測試的問題是你正在執行一個表達式,不能完成。與聲明(S)測試,一些意見顯示一些類似下面的所有語句

a=4 
return 1+2 
return math.sqrt(a) 
print('hi') 

a 
4 
1+2 
math.sqrt(a) 
'hi' 

都是表達式。請注意,lua_tostring將返回塊返回的內容。如果塊沒有返回任何東西,那麼lua_tostring將返回nil,就像調用ret=func(whatever)時任何不返回任何東西的函數一樣。

+1

或者如果編譯失敗,自動添加它。 – lhf

+0

@ lhf好主意;我想這可能是一個好主意,以區分表達和聲明 – Schollii

+0

對不起,我不斷刪除我的意見。看來,lua_tostring(luastate,-1)不斷返回LUA_TNIL。但是,如果我重定向到標準輸出,我可以看到例如'print(3)'的結果。 – macroland