小编Ana*_*Ana的帖子

解决ANTLR词法分析器规则歧义的正确方法是什么?

请参阅以下网址提供的源代码:https://gist.github.com/1684022.

我定义了两个令牌:

ID  :   ('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')*;

PITCH   
    :   (('A'|'a') '#'?)
    |   (('B'|'b') '#'?) 
    |   (('C'|'c') '#'?);
Run Code Online (Sandbox Code Playgroud)

显然,字母"A"将是一种模糊性.

我进一步定义:

note    :   PITCH;
name    :   ID;
main    :   name ':' note '\n'?
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入"A:A"作为解析器的输入,我总是会收到错误.解析器需要PITCH或ID,具体取决于是先定义ID还是PITCH:

mismatched input 'A' expecting ID
Run Code Online (Sandbox Code Playgroud)

解决这个问题的正确方法是什么,以便按预期工作?


如上所述,虽然直观地解释了解析应该如何工作,但ANTLR并没有做"正确的事".也就是说,即使main规则说a name/ ID应该首先出现,但是词法分析者似乎对此一无所知并将"A"标识为a,PITCH因为它遵循"最长匹配"/"首先出现"规则而不是更合理"什么规则说"规则.

通过匹配ID和PITCH,然后像dasblinkenlight所说的那样重新组合它们是假冒/破解它的唯一解决方案吗?

grammar antlr

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

如何控制Haskell中的记录导出?

使用以下示例模块:

module Exp ( initial, myval ) where
data State = State { i :: Int }
initial = State { i = 123 }
myval st = i st
Run Code Online (Sandbox Code Playgroud)

在GHCI中加载模块后,我可以看到Statei名称也已导出.我可以得到他们的类型并使用它们.如何限制导出以便仅导出initial(黑盒子)并myval导出?

haskell module record

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

优化Haskell递归列表

之前的另一个Haskell优化问题.我需要递归生成一个列表,类似于许多介绍性Haskell文章中的fibs函数:

generateSchedule :: [Word32] -> [Word32]
generateSchedule blkw = take 80 ws
    where
    ws          = blkw ++ zipWith4 gen (drop 13 ws) (drop 8 ws) (drop 2 ws) ws
    gen a b c d = rotate (a `xor` b `xor` c `xor` d) 1
Run Code Online (Sandbox Code Playgroud)

上面的函数已经超过了我的最多时间和alloc-consume功能.分析器给出了以下统计信息:

COST CENTRE        MODULE             %time %alloc  ticks     bytes
generateSchedule   Test.Hash.SHA1     22.1   40.4   31        702556640
Run Code Online (Sandbox Code Playgroud)

我想过应用未装箱的向量来计算列表,但由于列表是递归的,因此无法找到方法.这将在C中有一个自然的实现,但我没有看到一种方法来使这更快(除了展开和写80行变量声明).有帮助吗?

更新:我实际上已经快速展开它以查看它是否有帮助.代码在这里.它很难看,实际上它比较慢.

COST CENTRE        MODULE             %time %alloc  ticks     bytes
generateSchedule   GG.Hash.SHA1       22.7   27.6   40        394270592
Run Code Online (Sandbox Code Playgroud)

optimization haskell

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

Haskell无限类型和我的FSM功能

当我试图编写有限状态机时,我刚刚遇到Haskell中的"无限类型".我认为以下内容非常直观:

fsm []     _     acc = Right acc
fsm (x:xs) state acc =
    case state acc x of
        Left err     -> Left err
        Right (s, a) -> fsm xs s a
Run Code Online (Sandbox Code Playgroud)

我给状态函数提供当前状态(累加器)和新事件,状态函数与新累加器一起产生下一个状态函数.我递归,直到我没有更多的事件.

编译器告诉我:

Occurs check: cannot construct the infinite type:
  t1 = b0 -> t0 -> Either a0 (t1, b0)
In the second argument of `fsm', namely `s'
Run Code Online (Sandbox Code Playgroud)

因为state现在是无限型.如何重新排列以使其工作?

haskell types

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

将CALayer的圆角内容区域轮廓设置为剪切路径

我可以创建一个CALayer使用[CALayer layer],然后使用圆角layer.cornerRadius = x.

我这样做后,我有一个圆角矩形图层.我可以将这个圆角矩形轮廓提取为路径,而无需自己重新创建路径吗?

core-animation core-graphics objective-c ios

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

如何使Emacs的ELPA列表包屏幕的“包”列更宽?

当我list-packages在Emacs 24上运行时,我得到一个类似于以下内容的屏幕:

埃尔帕

问题在于许多软件包的名称都比软件包列长。如何扩大此列的范围,以便可以看到完整的软件包名称?

emacs elpa

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

如何让Cabal Sandbox安装正确链接的HTML文档?

我使用以下命令在沙箱中创建了一个cabal库:

cabal sandbox init
cabal init
Run Code Online (Sandbox Code Playgroud)

我添加了一行documentation: Truecabal.config确保生成文档,并且我在vector包中添加了依赖项mylib.cabal.然后我跑了:

cabal install --only-dependencies
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

/scm/hs-proj/.cabal-sandbox
Configuring primitive-0.6...
Building primitive-0.6...
Installed primitive-0.6
Configuring vector-0.10.12.3...
Building vector-0.10.12.3...
Installed vector-0.10.12.3
Updating documentation index
/scm/hs-proj/.cabal-sandbox/share/doc/x86_64-osx-ghc-7.10.1/index.html
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

当我打开索引文件时,它包含许多包的链接,例如:

file:///scm/hs-proj/.cabal-sandbox/share/doc/x86_64-osx-ghc-7.10.1/Data-List.html
file:///scm/hs-proj/.cabal-sandbox/share/doc/x86_64-osx-ghc-7.10.1/Data-Vector.html
Run Code Online (Sandbox Code Playgroud)

但是这些链接指向任何真实文件.请注意,这是额外依赖项的情况vector,也适用于内置包列表Data.List.

所以我认为我已经错误地安装了文档.有人可以指出我是如何错误地安装文档以及如何正确地执行此操作的?

haskell cabal haddock

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

如何知道在Clojure中放置类型提示以提高数值性能?

关于类型提示Clojure文档中,它有关于类型提示和强制如何使代码运行得更快的以下示例:

(defn foo [n]
  (loop [i 0]
    (if (< i n)
      (recur (inc i))
      i)))

(time (foo 100000))
"Elapsed time: 0.391 msecs"
100000

(defn foo2 [n]
  (let [n (int n)]
    (loop [i (int 0)]
      (if (< i n)
        (recur (inc i))
        i))))

(time (foo2 100000))
"Elapsed time: 0.084 msecs"
100000
Run Code Online (Sandbox Code Playgroud)

如果您运行此代码(set! *warn-on-reflection* true),它不会显示反射警告.是否需要程序员试错才能看出这些装饰品在哪些方面有所不同?或者是否有工具指示有问题的区域?

performance clojure

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

如何将Repa数组折叠为任意值?

Repa的所有归约函数都折回为与数组内容相同的类型。例如:

foldAllP :: (Shape sh, Source r a, Elt a, Unbox a, Monad m) => (a -> a -> a) -> a -> Array r sh a -> m a
foldAllS :: (Shape sh, Source r a, Elt a, Unbox a) => (a -> a -> a) -> a -> Array r sh a -> a
Run Code Online (Sandbox Code Playgroud)

我想将repa数组折叠成可以传递给GUI库以呈现的数据结构,即任意值,但是我找不到库中的函数来执行此操作。这个功能存在[... | x <- [0..w-1], y <- [0..h-1]]吗?还是我必须使用来遍历单元格?

haskell repa

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

为什么我从简单的Haskell网络代码中获得"hPutChar:资源消失"错误?

我今天尝试从Haskell"Simple Servers"维基页面运行一些示例代码:

import Network
import Control.Concurrent
import System.IO

main = withSocketsDo $ do
    sock <- listenOn $ PortNumber 5002
    loop sock

loop sock = do
   (h,_,_) <- accept sock
   forkIO $ body h
   loop sock
  where
   body h = do
       hPutStr h msg
       hFlush h
       hClose h

msg = "HTTP/1.0 200 OK\r\nContent-Length: 5\r\n\r\nPong!\r\n"
Run Code Online (Sandbox Code Playgroud)

我在装有El Capitan的Mac上做这个.

当我尝试使用httperf网页上指示的方式运行此代码时,我在控制台上收到以下错误消息:

ep1: <socket: 29>: hPutChar: resource vanished (Broken pipe)
ep1: <socket: 29>: hPutChar: resource vanished (Broken pipe)
ep1: <socket: 29>: hPutChar: …
Run Code Online (Sandbox Code Playgroud)

sockets macos haskell

5
推荐指数
0
解决办法
455
查看次数