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

我正在尝试使用wxWidgets作为GUI编写一个简单的Lua解释器。我从多行文本框中读取Lua命令。以下是我的代码:

    wxString cmdStr = m_OutputWindow->GetLineText(line-1); //读取文本

    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: 在 <eof> 附近有语法错误

欢迎提供任何想法。

点赞
用户869951
用户869951

如果你希望用户输入一个表达式(例如 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),你可能不想在其前面加上 "return "。由于你正在读取多行文本代码,你可能会得到由换行符分隔的语句字符串。在这种情况下,你不应该追加 return;你测试的问题是你执行的是一个表达式,这是不可行的。测试使用语句,几个注释显示了一些类似下面的语句:

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) 时都会这样做。

2014-02-12 13:28:53