【问题标题】:A simple Lua interpreter embedded in wxWidgets嵌入在 wxWidgets 中的简单 Lua 解释器
【发布时间】:2014-02-12 10:55:07
【问题描述】:

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

任何想法表示赞赏。

【问题讨论】:

  • 3+5 不是有效的 Lua 语句,它是一个表达式。改用print(3+5) 之类的东西。 lua-users.org/wiki/ExpressionsAsStatements
  • 如果我给出命令:print(3+5) 那么我得到以下错误 [string "line"]:1: unexpected symbol near char(236)
  • @macroland。我建议您尝试将命令作为 const 字符串。这将暂时将 wxWidgets 排除在外。 const char* commandStr="return 3+5";

标签: c++ lua wxwidgets


【解决方案1】:

如果你想让用户输入一个表达式(比如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 之前添加;您的测试的问题是您正在执行一个表达式,无法完成。用 statement(s) 测试,几个 cmets 显示一些类似以下的都是 statements

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) 时都会执行一样。

【讨论】:

  • 或者编译失败自动添加。
  • @lhf 好主意;我想区分表达式和语句可能是个好主意
  • 抱歉,我一直在删除我的 cmets。似乎 lua_tostring(luastate,-1) 不断返回 LUA_TNIL。但是,如果我重定向到标准输出,我可以看到例如 print(3) 的结果。
  • @macroland 我已经扩展了我的答案hth
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多