我正在研究一种基本的手工编码词法扫描仪,并希望支持UTF-8输入(它不再是1970年了!).输入字符一次读取stdin
一个文件或一个文件,然后推入缓冲区直到看到空白等.我想为自己编写自己的包装器fgetc()
而不是返回char[]
构成UTF-8字符的字节并使用结果作为一个字符串...它很容易,但会变成一个滑坡.我宁愿不浪费时间重新发明轮子,而是使用像ICU这样的现有测试库.所以现在我有一个非UTF-8支持的代码与工作fgetc()
,isspace()
,strcmp()
等我正努力更新使用ICU.这是我第一次尝试使用ICU,并且一直在阅读文档并尝试使用Google代码搜索查找使用示例,但仍然存在一些混淆点,我希望有人能够澄清.
该u_fgetc()
函数返回UChar
,并u_fgetcx()
返回UChar32
...文档建议使用u_fgetcx()
读码点,所以这就是我开始用.我保持与上面相同的方法,但我将UChar32
s 推入缓冲区而不是char
s.
将角色与已知值进行比较的正确方法是什么?最初我能够if (c == '+')
检查加号是否从输入中获取.当GCC不抱怨c
是UChar32
(然后进行比较UChar32
和char
),但是这真的是正确的?
例如,我能够用strcmp()
缓冲的字符与已知值进行比较if ((strcmp(buf, "else") == 0)
.还有就是u_strcmp()
由ICU提供,我想我可能需要使用U_STRING_DECL
和U_STRING_INIT
宏指定已知的文字,但我不能肯定.文档显示它们的结果UChar[]
,但我认为我需要UChar32[]
......而且我不确定如何正确使用它们.这里的任何指导都会受到欢迎.
在阅读了一系列数字字符后,我一直在转换它们,strtol()
所以我可以使用它们.自从我现在转换以来,ICU是否提供了类似的功能UChar32[]
?
我不是今天的JavaScript框架的忠实粉丝.我认为很多库可以写得更好,因为偏袒而不是理解手头问题的要求而被选为项目,而且一些JavaScript开发人员过于依赖它们到jQuery或dojo程序员,而不是JavaScript程序员.唉,这是一个人的意见,事实是JavaScript框架是生活的一部分.所以,这是一个旧问题的新视图:哪个JavaScript框架最不邪恶?也就是说,哪个库最符合最佳实践?考虑到jQuery片刻,它使用浏览器嗅探并且不new
用于构造函数.它非常受欢迎,有些人可能会通过某种标准来判断它是最好的,它忽略了在这些情况下被接受为最佳实践的内容.
编辑:请不要说jQuery或YUI或道场或其他什么.请说明哪些但也提供示例.
我被告知IBM不再使用Dojo.这是真的?少量的网络搜索显示IBM是/ Dojo基金会的成员,并且/是代码贡献者......如果确实如此,大约IBM何时停止使用Dojo?如果不是,那么IBM仍在积极使用和推广该工具包(在其公共网站中使用,产品集成/捆绑等)?
我有一个mysql数据库,其中包含一个超过600万行且没有索引的特定表.诸如此类的简单查询SELECT ... FROM log ORDER BY log_date ASC
将花费不可接受的时间.我显然需要在表中添加索引,但我不确定最有效的方法.
1)我的第一个选择是发布ALTER TABLE log ADD INDEX log_date
,但我不确定需要多长时间...它会花费与前一个查询大致相同的时间长度吗?如果是这样,这是不可接受的.
2)我的第二个选择是导出表,TRUNCATE
表,发出ALTER TABLE
语句,然后重新导入表数据.我不确定重新导入数据需要多长时间,并且担心如果系统在此过程中尝试将行写入表中会发生什么.
是否有人能够深入了解在生产系统中索引中等大小的表而不会造成太多悲伤的最佳方法?
我有一个flex生成的扫描仪,输出不会被yacc或bison消耗掉.yylex()需要返回指向类似于令牌的结构内存的指针,而不是指示令牌类型的int.
// example definition from foo.l
[A-Za-z_][A-Za-z0-9_]* { return scanner_token(T_IDENTIFIER); }
// example implementation of scanner_token
token *scanner_token(name) {
token *t = (token *)calloc(1, sizeof(token));
t->name = name;
t->lexeme = (char *)calloc(yyleng + 1, 1);
if (t->lexeme == NULL) {
perror_exit("calloc");
}
memmove(t->lexeme, yytext, yyleng);
return t;
}
// example invocation of yylex
token *t;
t = (token *)yylex();
Run Code Online (Sandbox Code Playgroud)
当然,编译警告我返回使用指针进行整数而不进行强制转换.
我在flex手册页中读到了YY_DECL
控制如何声明扫描例程的内容:
YY_DECL
控制如何声明扫描例程.默认情况下,它是"int yylex()
",或者,如果正在使用原型,"int yylex(void)
".可以通过重新定义"YY_DECL
"宏来更改此定义.
当我尝试重新定义时YY_DECL
,生成的C文件无法编译.
#undef YY_DECL
#define …
Run Code Online (Sandbox Code Playgroud) 由于各种原因,我将不在这里讨论,我在C中编写一个简单的标记化器.下面是一个示例,我在从输入流中读取字符时根据需要以预定的增量调整标记缓冲区的大小.它最终将达到最大令牌的大小,这显然可以容纳更小的令牌.这是一种可接受的方法吗?如果没有,确定为每个令牌分配的正确内存量的最佳方法是什么?
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define BUFF_CHUNK_SIZE 4
int main() {
int c, i, n;
char *buffer;
i = 0;
n = BUFF_CHUNK_SIZE;
buffer = (char *)calloc(n, sizeof(char));
while ((c = getchar()) != EOF) {
if (isalnum(c)) {
buffer[i] = (char)c;
i++;
if (i == n) {
n += BUFF_CHUNK_SIZE;
buffer = (char *)realloc(buffer, n * sizeof(char));
}
}
else {
if (i == 0) {
continue;
}
i = 0;
printf("%s\n", buffer);
memset(buffer, 0, sizeof(char) * n); …
Run Code Online (Sandbox Code Playgroud) c ×3
javascript ×2
dojo ×1
flex-lexer ×1
frameworks ×1
icu ×1
indexing ×1
mysql ×1
performance ×1
utf-8 ×1