小编Xia*_*Jia的帖子

在C中使用解析器组合器的更好方法?

我正在尝试从头启动C(的子集),而不使用额外的依赖项(解析器生成器,库等)。我也想利用解析器组合器的思想,这在函数式编程中是一种很棒的技术。我想以一种简洁实用的方式将这种想法从功能世界借鉴到过程C中。

我尝试为以下玩具语法实现一些必要的解析器组合器,这也是Simon Peyton Jones 的《实现功能语言-教程》一书中的示例。

greeting -> hg person "!"
hg       -> "hello"
          | "goodbye"
Run Code Online (Sandbox Code Playgroud)

person以字母开头的令牌在哪里?例如,令牌列表

["goodbye", "James", "!"]
Run Code Online (Sandbox Code Playgroud)

被解析为

[(("goodbye", "James"), ["!"])]
Run Code Online (Sandbox Code Playgroud)

(这本书使用了Haskell,很难使它与语言无关,但是您会明白的:-)

我用C语言实现了这一点,您可以在这里查看代码:https : //gist.github.com/4451478

此实现花费200多行C代码,远远超过本书中编写的约20行Haskell。因此,我不确定我是否在使用C进行解析器组合器方面是否正确,以及是否有任何可能的改进。任何建议都欢迎。提前致谢。

c compiler-construction parsing parser-combinators

6
推荐指数
2
解决办法
2870
查看次数

限制erlang使用的核心数

我正在使用2 x四核Xeon E5520 2.2GHz,24.0GB RAM和Erlang R15B02(启用SMP)的节点上运行实验.我想知道是否可以限制Erlang VM使用的内核数量,以便我可以暂时禁用某些内核并逐步增加数量以测试可伸缩性.

我在此节点上没有root访问权限.所以我期待一些方法,可以通过向erlErlang代码指定参数或通过Erlang代码指定参数.

erlang multithreading scalability smp

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

MediaWiki中AuthPlugin的上下文中的"域"是什么?

我正在为MediaWiki 编写自己的AuthPlugin,并参考正式提供的文档代码.有关域的几个功能:

AuthPlugin::domainList()
// Get a list of domains (in HTMLForm options format) used.

AuthPlugin::getDomain()
// Get the user's domain.

AuthPlugin::setDomain($domain)
// Set the domain this plugin is supposed to use when authenticating.
Run Code Online (Sandbox Code Playgroud)

但是,我不明白什么是域名,应该怎么样?这是AuthPlugin扩展的编写者想要的,而不是在默认的MW配置中有任何意义吗?

php authentication mediawiki

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

即使使用双引号也会发生单词分裂

根据http://tldp.org/LDP/abs/html/quotingvar.html

使用双引号来防止分词.用双引号括起来的参数将自身表示为单个单词,即使它包含空格分隔符.

但是,我有

0> /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
[...]

1> cat inspect.sh 
#!/bin/bash
echo "first argument is $1"
echo "second argument is $2"

2> cat test.sh 
#!/bin/bash
set -x
./inspect.sh "hello $@"

3> ./test.sh alice bob
+ ./inspect.sh 'hello alice' bob
first argument is hello alice
second argument is bob

4> ./test.sh "alice bob"
+ ./inspect.sh 'hello alice bob'
first argument is hello alice bob
second argument is 
Run Code Online (Sandbox Code Playgroud)

我想知道为什么3>和4>有不同的结果?如何修改test.sh让3>具有与4>相同的输出?

bash

4
推荐指数
1
解决办法
387
查看次数

spawn_link无法正常工作?

我正在使用spawn_link但不了解其行为.请考虑以下代码:

-module(test).
-export([try_spawn_link/0]).

try_spawn_link() ->
  spawn(fun() ->
    io:format("parent: ~p~n", [Parent = self()]),
    Client = spawn_link(fun() ->
      io:format("child: ~p~n", [self()]),
      spawn_link_loop(Parent)
    end),
    spawn_link_loop(Client)
  end).

spawn_link_loop(Peer) ->
  receive
    quit ->
      exit(normal);
    Any ->
      io:format("~p receives ~p~n", [self(), Any])
  end,
  spawn_link_loop(Peer).
Run Code Online (Sandbox Code Playgroud)

Erlang文档中,原子地在调用进程和新进程之间创建一个链接.但是,我测试如下,并没有注意到链接的影响.

1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true
4> pid(0,35,0) ! quit.
quit
5> is_process_alive(pid(0,35,0)).
false
6> is_process_alive(pid(0,34,0)).
true

1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true …
Run Code Online (Sandbox Code Playgroud)

erlang

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

循环类型同义词声明

我想尝试Haskell typedata使用以下代码

type Program a = Maybe a -> (Operation a, Maybe Program a)
data Operation a = Read a | Write a
Run Code Online (Sandbox Code Playgroud)

Program遵循延续传递方式(CPS)并Nothing指示终止.a可以用Int其他东西实例化.

然而,GHC抱怨说:

main.hs:1:1:
    Cycle in type synonym declarations:
      main.hs:1:1-58: type Program a =
                          Maybe a -> (Operation a, Maybe Program a)
Run Code Online (Sandbox Code Playgroud)

我是Haskell的新手,所以我不明白为什么不允许这样做.如何在Haskell中表达这种类型?

haskell types

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

在Haskell中建模循环调度程序时的非法数据类型上下文

我在Haskell中建模循环调度程序.

class Schedulable s where
  isFinal :: s -> Bool

class Scheduler s where
  add :: (Schedulable a) => a -> s -> s
  next :: (Schedulable a) => s -> (a, s)
  empty :: s -> Bool

data Schedulable a => RoundRobin = RoundRobin [a] [a]

instance Scheduler RoundRobin where
  add p (RoundRobin ps qs) = RoundRobin (ps ++ [p]) qs

  next (RoundRobin []     qs) = next (RoundRobin qs [])
  next (RoundRobin (p:ps) qs) = (p, RoundRobin ps (qs …
Run Code Online (Sandbox Code Playgroud)

haskell typeclass algebraic-data-types

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