我正在尝试使用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>
任何想法都赞赏。
答案 0 :(得分:2)
如果您希望用户输入表达式(如1+2
或a+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)
时一样。