Lua1.1 输入准备

接着看 main 调用,在库打开之后,会调用 lua_dostring 或 lua_dofile。

lua_dostring 是从标准输入读取 lua 代码。
lua_dofile 是从文件读取 lua 代码,我们来看下这两种有什么区别。

lua_dostring
调用 lua_openstring,
opcode.c:

/*
** Generate opcode stored on string and execute global statement. Return 0 on
** success or 1 on error.
*/
int lua_dostring (char *string)
{
 if (lua_openstring (string)) return 1;
 if (lua_parse ()) return 1;
 lua_closestring();
 return 0;
}

打开输入字符串,语法分析,之后关闭输入。

我们看下 lua_openstring 做了什么
inout.c 文件中

/*
** Function to open a string to be input unit
*/
int lua_openstring (char *s)
{
 lua_linenumber = 1;
 lua_setinput (stringinput);
 st = s;
 {
  char sn[64];
  sprintf (sn, "String: %10.10s...", s);
  if (lua_addfile (sn)) return 1;
 }
 return 0;
}

设置开始行号为 1
给词法分析器设置输入 lua_setinput (lex.c 中)。
把输入的字符串地址保存在 st
把文件名保存到文件名数组中去 lua_addfile (table.c 中)。

void lua_setinput (Input fn)
{
  current = ‘ ‘;
  input = fn;
}

设置当前字符,和 input 回调。这里是 stringinput
inout.c 文件中:

/*
** Function to get the next character from the input string
*/
static int stringinput (void)
{
 st++;
 return (*(st-1));
}

注释里已经说的很清楚了,从输入的字符串中取得一个字符。

lua_addfile 把文件添加到文件数组中。
table.c 文件

/*
** Add a file name at file table, checking overflow. This function also set
** the external variable "lua_filename" with the function filename set.
** Return 0 on success or 1 on error.
*/
int lua_addfile (char *fn)
{
 if (lua_nfile >= MAXFILE-1)
 {
  lua_error ("too many files");
  return 1;
 }
 if ((lua_file[lua_nfile++] = strdup (fn)) == NULL)
 {
  lua_error ("not enough memory");
  return 1;
 }
 return 0;
}

再看看 lua_dofile 是做什么的。
opcode.c 文件中:

/*
** Open file, generate opcode and execute global statement. Return 0 on
** success or 1 on error.
*/
int lua_dofile (char *filename)
{
 if (lua_openfile (filename)) return 1;
 if (lua_parse ()) { lua_closefile (); return 1; }
 lua_closefile ();
 return 0;
}

打开文件,语法分析,关闭文件。

inout.c 文件中

/*
** Function to open a file to be input unit. 
** Return 0 on success or 1 on error.
*/
int lua_openfile (char *fn)
{
 lua_linenumber = 1;
 lua_setinput (fileinput);
 fp = fopen (fn, "r");
 if (fp == NULL) return 1;
 if (lua_addfile (fn)) return 1;
 return 0;
}

设置行号,设置词法分析的输入,
这里调用的还是 lex.c 中的 lua_setinput。经过这样的处理,词法分析的时候已经没有标准输入或者文件输入的概念,词法分析只管在需要的时候从函数输入指针取字符,不同的输入在这里已经是透明的了。

打开文件,之后 lua_addfile , 把文件名保存到文件名数组中。

inout.c

/*
** Function to get the next character from the input file
*/
static int fileinput (void)
{
 int c = fgetc (fp);
 return (c == EOF ? 0 : c);
}

从文件中读出一个字符。如果已经到文件结束,返回 0 。
到这里,词法分析的输入已经准备好了。

通过分析代码我们可以看到,不管是 lua_dostring 或者是 lua_dofile,都调用了 lua_parse。

时间: 2024-10-14 19:46:13

Lua1.1 输入准备的相关文章

Lua1.1 语法分析

无论是 lua_dostring 或者是 lua_dofile,都调用了语法分析 lua_parse.在 lua 里面语法分析器是用 yacc 生成的,就是y.tab.c 文件,lua.stx 就是 yacc 的输入文件.这里说的东西基本上编译原理书里都有介绍,如需要进一步了解,请自行参阅. 在说语法分析之前,说下词法分析.lua 的词法分析是手写的,手写的词法分析性能比较好,这个在 lua1.1 自带的文档里有说明,文件名 lua.ps, 第 8 页 (或者 www.lua.org/semis

Lua1.1 Lua 的设计和实现 (一)

转载出处:http://my.oschina.net/xhan/blog/309613 说明: 这个文档是 Lua1.1 的 doc 目录里的 lua.ps 文件. 同时这个文档可以这里找到:http://www.lua.org/semish94.html 原文版权归原作者所有,这篇翻译只是作为学习之用.如果翻译有不当之处,请参考原文. --------------------以下是正文------------------ 应用程序扩展语言的设计和实现 摘要.我们描述 Lua 的设计和实现,一个

苹果手机输入中文不会触发onkeyup事件

今天同事的项目有这个问题,用我的安卓手机输入中文是ok的,但是苹果手机就不行 使用keyup事件检测文本框内容:  $('#keyup_i').bind('keyup', function(){         $('#keyup_s').text($(this).val());  } 本来是上面这种处理方式,现在改成下面这样就ok了 使用oninput以及onpropertychange事件检测文本框内容:  //先判断浏览器是不是万恶的IE,没办法,写的东西也有IE使用者       var

Android-------ListView列表中获取EditText输入的值

最近项目的购物车中用列表中包含了留言功能, 需要获取EditText输入的内容,当购买多件商品时,就有点棘手了. 经过查资料解决了这个功能,并写了一个案例: 效果图: 可以在商品数据用一个字段来管理留言数据,这样就可以方便的操作了. 代码: public class MainActivity extends AppCompatActivity { ListView listView; @Override protected void onCreate(Bundle savedInstanceSt

iOS 限制输入框不能输入中文

开发中遇到这个问题,想着还是总结下,刚开始只是限制UITextField的键盘为 UIKeyboardTypeASCIICapable,可是当用户切换了中文键盘后依然没解决问题,于是我给输入框加了监听事件,获取输入框最新的输入内容,检测输入的内容中是否含有中文,如果有中文就替换成空字符串,具体实现如下: infoView.userTF.keyboardType = UIKeyboardTypeASCIICapable; //监听输入内容 [[NSNotificationCenter defaul

Ubuntu 16.04 GNOME下解决Sublime Text3中文输入(ibus)(转)

解决方法: 1.进入Sublime Text3插件管理文件夹 cd ~/.config/sublime-text-3/Packages 2.获取InputHelper插件 git clone https://github.com/xgenvn/InputHelper.git 3.如果发现在Sublime Text3中无法使用Ctrl+Shift+Z调出输入框,请检查是否安装pygtk sudo apt-get install python-gtk2-dev 4.每次输入中文时都要输入Ctrl+S

解决query查询输入geometry参数查询不到而通过where条件可以查到的问题

解决query查询输入geometry参数查询不到而通过where条件可以查到的问题 原因: 是因为geometry的坐标系和所要查询的图层不一样导致的(问题引起是由于底图中叠加了不同的坐标系的引起的) 问题描述: 我在公司做好的功能并且测好了,到现场出了问题,发现通过where语句查询时正常的,拉宽查询不正常.并且通过网页打开图层查询请求页面,手动输入代码中得到的geometry查询是可以查到数据的. 问题解决过程: 通过fiddler跟踪请求的http路径(因为arcgisAPI请求arcg

要求用户输入宽和高,显示出长方形的面积。

import java.util.Scanner; /** * @author 蓝色以太 * 要求用户输入宽和高,显示出长方形的面积. */ public class Area { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入长度:"); double length=sc.nextDouble(); System.out.printl

输入password登录到主界面,录入学生编号,排序后输出

n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1.  语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2.  要求 请编写一个C语言程序.将若干学生编号按字母顺序(由小到大)输出. 程序的功能要求例如以下: 1)  输入password"admin",正确则进入主界面,错误则直接推出(exit(0)): 2)从键盘输入5个学生编号"BJS1001","BJS2001"."BJS1011&