lua 如何区分 lua中文乱码 的文字和符号

Lua5.1代码阅读(二):llex.h/llex.c - weimingtom的待宵草 - ITeye技术网站
博客分类:
Lua5.1代码阅读(二):llex.h/llex.c
(未完成,待修改)
一、作用和参考资料
llex.c是Lua的词法分析器(把单个输入字符串切割为多个输出符号)
1. Lua 5.1.3源代码分析之词法分析 By 天地沙鸥
//lua-5-1-3%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90%E4%B9%8B%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90/
二、包含头文件
#include "lobject.h"
#include "lzio.h"
#include &ctype.h&
#include &locale.h&
#include &string.h&
#include "lua.h"
#include "ldo.h"
#include "llex.h"
#include "lobject.h"
#include "lparser.h"
#include "lstate.h"
#include "lstring.h"
#include "ltable.h"
#include "lzio.h"
1. #define FIRST_RESERVED 257
RESERVED枚举值第一个枚举的整数值。
大于256的目的可能是想避开ASCII值的范围(见luaX_token2str)。
2. #define TOKEN_LEN (sizeof("function")/sizeof(char))
保留字的最大内存长度(包括结尾的'\0')。
3. #define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1))
保留字的个数(cast是定义在llimit.h的宏,用于C强制转换)。
4. #define llex_c
llex.c的宏缩写(象征形式)
5. #define LUA_CORE
表示llex.c位于底层实现中(象征形式)
6. #define next(ls) (ls-&current = zgetc(ls-&z))
从输入流中读取一个字符值,保存为ls(词法分析器)的当前字符值
7. #define currIsNewline(ls) (ls-&current == '\n' || ls-&current == '\r')
判断当前是否回车。
8. #define save_and_next(ls) (save(ls, ls-&current), next(ls))
把当前字符保存到变长缓冲区,然后读下一个符号。
9. #define MAXSRC
用于处理源文件名ls-&source的临时缓冲区的最大长度(?)
enum RESERVED {
TK_AND = FIRST_RESERVED, TK_BREAK,
TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION,
TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,
TK_NAME, TK_STRING, TK_EOS
保留字枚举量(和luaX_tokens对应),表示特殊的token范围。
如果要修改它的顺序,需要修改注释有ORDER RESERVED的代码。
* TK_AND到TK_WHILE是表示保留字的终结符(终结符是指语法中不需要继续推导的符号)
* TK_CONCAT到TK_EOS是非保留字的其它终结符(运算符、字面值和文件结束)。
五、公开的全局变量
1. LUAI_DATA const char *const luaX_tokens [];
const char *const luaX_tokens [] = {
"and", "break", "do", "else", "elseif",
"end", "false", "for", "function", "if",
"in", "local", "nil", "not", "or", "repeat",
"return", "then", "true", "until", "while",
"..", "...", "==", "&=", "&=", "~=",
"&number&", "&name&", "&string&", "&eof&",
names符号(终结符)的常量字符串数组(对应RESERVED枚举的顺序)。
用于把特殊符号转换为字符串。
六、结构体、联合体
typedef union {
单个语义信息(联合体)
typedef struct Token {
单个符号信息(结构体)
typedef struct LexState {
struct FuncState *
struct lua_State *L;
词法状态:
* current:当前int型字符值
* linenumber:输入行号
* lastline:最后一个被消费的符号的行号。
* Token:当前符号信息
* lookahead:向前看的符号信息
* fs:函数状态,对于parser是私有的
* L:Lua状态机
* z:输入流
* buff:符号缓冲
* source:当前源码文件名
* decpoint:本地区域的十进制浮点
七、全局私有的静态方法
1. static void save (LexState *ls, int c) {
把c接到ls-&buff变长缓冲区的结尾(确保不会超出缓冲区范围)
2. static const char *txtToken (LexState *ls, int token) {
根据token取出字面值。
如果token是名称、数、字符串字面值,把ls-&buff转成'\0'结束的C字符串。
如果token是特殊token(保留字、运算符),直接返回其字符串形式。
3. static void inclinenumber (LexState *ls) {
增加行号(检查溢出)。
然后跳过附近的'\n'和'\r'。
4. static int check_next (LexState *ls, const char *set) {
检查词法状态机的当前字符值是否在字符集set内。
如果是,则执行save_and_next
5. static void buffreplace (LexState *ls, char from, char to) {
把词法状态机的缓冲区中的字符值from全部替换为字符值to。
6. static void trydecpoint (LexState *ls, SemInfo *seminfo) {
把'.'改为本地(locale)的十进制小数点分割符
(使用&locale.h&的函数localeconv获取本地数字及货币信息格式),
然后继续尝试字符串到数字的转换。
7. static void read_numeral (LexState *ls, SemInfo *seminfo) {
循环(逐字符)读取LUA_NUMBER(内部实现是double型)字面值字符串
8. static int skip_sep (LexState *ls) {
循环读取[=或]=分割符,
然后返回其层数('='的个数,如果是右面则为负数)
9. static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
读带分隔符的字符串字面值(如[[abc]])
10. static void read_string (LexState *ls, int del, SemInfo *seminfo) {
读一般的字符串字面值(如"abc",'abc')
11. static int llex (LexState *ls, SemInfo *seminfo) {
词法分析器循环,使用switch进行跳转。
八、全局公开的方法
1. void luaX_init (lua_State *L) {
LUAI_FUNC void luaX_init (lua_State *L);
初始化词法分析器:
* 把所有保留字加入符号表。确保所有保留字的符号表字符串不被回收。
* 诊断TOKEN_LEN是最大的保留字长度。
2. const char *luaX_token2str (LexState *ls, int token) {
LUAI_FUNC const char *luaX_token2str (LexState *ls, int token);
把int型的token(可印刷字符、控制字符、保留字符号)转为可读的字符串。
3. void luaX_lexerror (LexState *ls, const char *msg, int token) {
LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token);
报告词法错误,然后抛出LUA_ERRSYNTAX异常。
4. void luaX_syntaxerror (LexState *ls, const char *msg) {
LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s);
报告语法错误,然后抛出LUA_ERRSYNTAX异常。
和luaX_lexerror相同,只是报告的token是当前词法状态机的符号。
5. TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l);
在符号表中创建字符串(确保不会重复收集),返回TString指针(符号表字符串)。
6. void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {
LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source);
初始化词法状态机的输入流ls,然后读取第一个字符值
7. void luaX_next (LexState *ls) {
LUAI_FUNC void luaX_next (LexState *ls);
读下一个词法符号。
如果已经有被lookahead的词法符号,就直接取它的值避免遗漏。
8. void luaX_lookahead (LexState *ls) {
LUAI_FUNC void luaX_lookahead (LexState *ls);
向前看(lookahead,即提前读)后一个词法符号。用于语法预测。
九、值得观察的关键代码
它是luaX_next和luaX_lookahead的底层实现
(未完成,待修改)
weimingtom
浏览: 223856 次
来自: 广州
谢谢博主,翻译得很好哦
牙痛的彼岸:痹!
总结得很简练清晰啊,学习了!
恩,同样期待,毕竟是一代经典cocos2d-x&Lua基本细节(转)
猴子原创,欢迎转载。转载请注明:&,谢谢!
原文地址:&
一、程序块的写法:
这四个程序块都是等价的。
二、Lua 变量区分大小,~= 是 不等于
三、注释符号
注意:多行注释符号一般这样写:
优点:假如你想把注释去掉,直接在开头注释符号前面加一个连接符就可以了。(多行注释符号被改成了单行)
四、全局变量不用声明,赋值就可以了,不用的时候赋值nil,未赋值的全局变量为nil
五、boolean,只有false和nil是假,其他值都是真(包括0和空字符串)
六、number ,表示双精度浮点数,Lua没有整数类型
七、string,可以赋值为任意二进制数据
1、注意Lua的字符串是不可变的值,不能像c++那样修改字符串里的字符,需要修改的话请创建一个新的字符创。
2、在字符串上面进行算术操作,lua会将字符串转化成数字
3、tonumber(),字符串转数字
3、tostring(),数字转字符串(也可以使用连接符,123 .. "" )
4、#,长度操作符,获取字符串长度
八、table,一种关联数组,也就是一种有索引方式的数组,索引值可以是整数、字符串或其他类型。(nil不可以作为table索引值)
注意:c.y 等价与
c["y"],但是不同于c[y]
常用技巧:
注意:不推荐使用索引0为起始索引,大多数内建函数都假设数组索引开始于1,所以为0的索引数组可能会出现错误。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Programming in LUA中文版_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
喜欢此文档的还喜欢
Programming in LUA中文版
P​r​o​g​r​a​m​m​i​n​g​ ​i​n​ ​L​U​A​中​文​版
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:94.88KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢您当前所在位置:
Word中如何设置不同的文字符号字体
Word中如何设置不同的文字符号字体
第九软件网
在word的使用过程中,我们往往会统一字体,但是,统一字体的同时,有些标点符号却并不是那么美观不适用于该文章中,那么该如何设置不同的文字符号字体呢?
  在word的使用过程中,我们往往会统一字体,但是,统一字体的同时,有些标点符号却并不是那么美观不适用于该文章中,那么该如何设置不同的文字符号字体呢?
  打开:
  接下来输入自己需要的文字,我们设置为&宋体&字体,引号也是&宋体&(接下来我们需要把它换成&雅黑&字体)
  如果标点符号也换成&雅黑&字体的话,效果就如下图所示了,不能直接区分前引号和后引号。
  & 所以这里我们要做的就是将需要改字体的文字选中:
   可以通过顶端的字体选择/悬浮的文字设置选择中来使用&微软雅黑&:
  &&& 这样,我们又能使用&雅黑&的舒适字体,又能体验前后分明的&宋体&双引号了。
&&&&&&&&&&&&&& 相关下载:【】
  &&&&&&&转载请注明出处:第九软件网
关键词标签:
延伸相关阅读:
软件教程推荐
第九专题推荐
每周酷软推荐
小巧方便的极速浏览器
彩蝶浏览器是一款便捷、小巧的上网浏览工具,占用内存小,一键触达...
第九Word推荐怎样将Word文档的标点符号设为中文字体?_百度知道
怎样将Word文档的标点符号设为中文字体?
就可以全部变成中文逗号,在查找中输入英文标点正常情况下,输入的就是中文标点,这里可以讲西文字体包括标点设置为中文,只要你不关闭中文输入状态,若文档中有许多西文标点符号。打开字体设置(ctrl+d),然后在替换中输入中文标点,然后全部替换。其他标点也是如此,使用编辑菜单中的替换命令,比如逗号(,),),比如逗号(
其他类似问题
14人觉得有用
按默认排序
其他1条回答
//d。  2.com/zhidao/pic/item/2e2ebef3406ce0dde7f,方法如下,方法如下://d.jpg" esrc="http.baidu.baidu:编辑-替换查找内容一栏中输入这些需要替换标点符号、如果是全文格式统一,高级选项里选中“区分全/半角”选项.hiphotos。
标点符号的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 lua中文手册 的文章

 

随机推荐