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

3

我正在尝试使用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>

任何想法都会受到赞赏。

2
3+5 不是有效的 Lua 语句,它是一个表达式。请尝试使用类似 print(3+5) 的语句。http://lua-users.org/wiki/ExpressionsAsStatements - Roddy
如果我输入命令:print(3+5),那么我会得到以下错误信息:[string "line"]:1: unexpected symbol near char(236)。 - macroland
@macroland。我建议您尝试将命令作为常量字符串放置。这将暂时将wxWidgets排除在外。const char* commandStr="return 3+5"; - Roddy
1个回答

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),你可能不想在前面添加它。由于你正在阅读多行文本代码,所以很可能会得到由换行符分隔的语句字符串。在这种情况下,你不应该添加 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)时返回空值的任何函数一样。


1
如果编译失败,可以手动添加它。 - lhf
@lhf 好主意;我猜区分表达式和语句可能是个不错的主意。 - Oliver
抱歉我一直在删除我的评论。似乎lua_tostring(luastate,-1)一直返回LUA_TNIL。但是,如果我重定向到stdout,例如可以看到“print(3)”的结果。 - macroland
@macroland 我已经扩展了我的答案,希望对你有所帮助。 - Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接