小编vyo*_*yom的帖子

使用flex/bison构建Lisp/Scheme类似的解析树

我试图解析简单的Lisp/scheme-like代码

E.g. (func a (b c d) )
Run Code Online (Sandbox Code Playgroud)

从中构建一个树,我可以在不使用的情况下在C中进行解析bison(即,仅 flex使用返回标记并使用递归构建树).但是,使用bison语法,我不知道在哪里添加代码来构建列表(即,与累积终端符号相关联的规则以及将构建列表链接到父节点的位置).

我的语法类似于这里的语法: yacc中Lisp语法,语法是正确的,可以识别代码.

lisp parsing bison s-expression flex-lexer

10
推荐指数
1
解决办法
3458
查看次数

将LuaJIT模块嵌入到C应用程序中

在我的应用程序中,我从C后端公开了所有Lua库.现在,我需要加载一个Lua模块.对此的方法似乎是:

lua_getglobal(L, "require");
lua_pushstring(L, libname);
lua_pcall(L, 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)

将搜索package.path以查找<libname>.lua并加载它.

是否可以将Lua模块内置到C应用程序中(以便模块成为C应用程序的一部分)?所以我不必单独打包Lua模块.不知何故,我无法找到任何参考或示例!:(

ps我正在使用LuaJIT-2.0.2,有问题的库是SciLua/Time(使用ffi)

lua luajit

7
推荐指数
1
解决办法
2608
查看次数

在Patricia Trie中找到最长前缀搜索的算法/步骤

我正在实现Patricia尝试进行IP前缀查找,我可以使代码工作以完成密钥匹配,但是当存在其他密钥的前缀时,如前面的搜索有问题,例如:

1.2.3.0
1.2.0.0
Run Code Online (Sandbox Code Playgroud)

在上述情况下,任何人都可以帮助我使用前缀搜索算法我应该将它们视为单独长度的键(即/ 24和16)吗?

ip lookup patricia-trie

6
推荐指数
1
解决办法
9462
查看次数

YAML解析 - lex还是手卷?

我正在尝试编写一个简单的YAML解析器,我从yaml.org读取规范,在开始之前,我想知道编写手动解析器或者使用lex(flex/bison)是否更好.我看了看libyaml(C库) - 好像没用lex/yacc.YAML(不包括流样式)似乎更面向行,因此,编写手动解析器或使用flex/bison Thanks 更容易.

parsing yaml lex bison flex-lexer

6
推荐指数
1
解决办法
1624
查看次数

外部lisp代码压缩器

我有一些类似lisp/scheme的代码,我想缩进.我搜索了像GNU这样的工具indent,但我找不到任何命令行实用程序/脚本.有很多可用于C/C++/Java,但不知何故我无法找到任何lisp/scheme,任何人都可以告诉我任何这样的缩进工具(如果可用).

谢谢.

lisp indentation

5
推荐指数
1
解决办法
1012
查看次数

跨Lua状态复制全局表

我有一个全局表,我希望在两个不同的Lua 状态之间保持同步.从我所阅读和理解的,唯一的方法似乎是,在我的C后端,在状态之间执行表的深层复制(如果表已被修改).有没有更好的办法 ?另外,我看到一些Lua片段用于表格深层复制,但不是在C中,是否有任何库[在C]中执行此操作?

PS我不是在找lua_thread基础解决方案(我已经在使用它了)

PPS Lua Lanes似乎很接近,但IMO似乎太多了,因为我只想同步1张桌子!

lua global-variables lua-table

5
推荐指数
1
解决办法
1816
查看次数

lua_xmove在不同的lua状态之间

根据lua 5.1手册,lua_xmove在属于相同Lua状态的不同线程的堆栈之间移动值.但是,我偶然碰巧使用它来移动不同Lua状态的值,它似乎工作正常!是否有任何其他API可以将值从一个Lua状态移动到另一个Lua状态(在5.1中),还是可以lua_xmove使用?

lua

5
推荐指数
1
解决办法
1323
查看次数

waf 将文件从源树复制到构建树

我有以下代码片段,将文件按原样复制到构建目录:

for m in std_mibs:
    print("Copying", m)
    bld(name       = 'cpstdmib',
        rule       = 'cp -f ${SRC} ${TGT}',
        #source     =  m + '.mib',
        source     =  bld.path.make_node(m + '.mib'), # <-- section 5.3.3 of the waf book
        target     =  bld.path.get_bld().make_node(m + '.mib')
        )
Run Code Online (Sandbox Code Playgroud)

我看到这条规则虽然(从打印中)被命中,但副本似乎并没有发生!我还更改了源以使用如图所示的 waf 书第 5.3.3make_node节中的示例,但仍然没有运气!我在这里错过了一些明显的东西吗!?

另外,在此之后我有一些规则,这些规则依赖于复制的文件,并且我尝试添加一个干预

bld.add_group()
Run Code Online (Sandbox Code Playgroud)

如果复制成功,我希望测序能够成功

copy waf sequencing

5
推荐指数
1
解决办法
1371
查看次数

如何在地址范围&gt; 4 GiB中分配

我正在尝试在X86_64 Linux上进行一些测试,并且我想知道如何使malloc()分配大于4 GiB范围内的返回地址

我是否必须使用单独的/自定义库覆盖malloc还是有其他简单的方法来做到这一点?

谢谢。

- - 编辑 - -

我感兴趣的是将地址当作uintptr_t)时的地址,它的虚拟地址还是物理地址都没有关系,因为我想要的就是该地址必须是大于4GiB 的

我在Linux x86_64上将gcc(4.2.1)与一起使用-m64

(希望我把问题弄清楚了)

c malloc

2
推荐指数
1
解决办法
1160
查看次数

从 makefile 中动态生成文件/对象列表

我正在尝试这样做:

从目录中选择所有C( .c) 文件,生成.o并将其添加到我的最终目标可执行文件中。这些C文件可以随时添加或删除,因此当我make为我的目标运行时,必须C从目录中挑选可用的文件来编译并链接到我的目标。

到目前为止,我有以下几点:

define test_tgt = 
DIR = full/path/to/dir
FILES = $(wildcard $(DIR)/*.c)
OBJS = <rule-to-convert-C-to-O>
endef

get_new_files: 
     $(eval $(test_tgt))

final-target: get_new_files 
      $(CC) <other-objs> $(OBJS)
Run Code Online (Sandbox Code Playgroud)

不知何故,这似乎不起作用。我看到很多类似的例子,但不确定这里有什么问题。如果这种方法不正确,任何人都可以提出更好的方法来实现这一点。

TIA。

makefile gnu-make

2
推荐指数
1
解决办法
5453
查看次数