一个简单的Lua解释器嵌入在wxWidgets中

时间:2014-02-12 10:55:07

标签: c++ lua wxwidgets

我正在尝试使用wxWidgets作为我的GUI编写一个简单的Lua解释器。我正在从多行文本框中读取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>

任何想法都赞赏。

1 个答案:

答案 0 :(得分:2)

如果您希望用户输入表达式(如1+2a+math.sqrt(b)),则必须先将“return”添加到该表达式中,然后再将其提供给解释器:

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),您可能不希望添加前缀。由于您正在阅读多行文本代码,因此您可能会获得由换行符分隔的语句串。在这种情况下,你不应该在前面加上;你的测试的问题是你正在执行一个表达式,无法完成。使用语句进行测试,几条评论显示如下所有语句

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)时一样。