我最近正在努力教自己解析器(语言/无上下文语法)是如何工作的,除了一件事以外,大部分解析器似乎都有意义.我特别关注LL(k)语法,其中两个主要算法似乎是LL解析器(使用堆栈/解析表)和递归下降解析器(简单地使用递归).
据我所知,递归下降算法适用于所有LL(k)语法,可能更多,而LL解析器适用于所有LL(k)语法.然而,递归下降解析器显然要比LL解析器简单得多(正如LL一个比LR一个简单).
所以我的问题是,使用任何一种算法时可能遇到的优点/问题是什么?为什么有人会选择LL而不是递归下降,因为它适用于同一组语法并且实现起来比较棘手?
grammar parsing recursive-descent context-free-grammar ll-grammar
我在Visual Studio中有一个包含多个项目的解决方案.我想在每次构建的最初阶段运行一个命令 - 无论涉及哪个项目以及它们是否是最新的.
基本上我需要类似于解决方案范围的预构建事件,但不幸的是VS似乎不支持这些.有没有人知道实现我需要的另一种方式?
我有一个128位无符号整数A和一个64位无符号整数B.什么是最快的计算方法A % B- 即将A除以B的(64位)余数?
我希望用C或汇编语言来做这件事,但我需要针对32位x86平台.遗憾的是,我无法利用编译器对128位整数的支持,也无法利用x64架构在单条指令中执行所需操作的能力.
编辑:
谢谢你到目前为止的答案.但是,在我看来,建议的算法会非常慢 - 执行128位到64位除法的最快方法是利用处理器对64位乘32位除法的原生支持吗?有没有人知道是否有办法在一些较小的部门中执行更大的划分?
回复:B多久换一次?
主要是我对一般解决方案感兴趣 - 如果A和B每次都可能不同,你会进行什么计算?
然而,第二种可能的情况是B不会像A那样经常变化 - 每个B可能有多达200个As除以.在这种情况下,你的答案有何不同?
在Visual Studio(2008)中,即使项目是最新的,也可以强制C++项目的Post-Build事件运行?
具体来说,我有一个项目,它构建一个COM进程内服务器DLL.该项目有一个后期构建步骤,运行"regsvr32.exe $(TargetPath)".这在"重建"上运行良好,但只有在对项目源进行了更改时才在"构建"上运行.
如果我在不进行任何更改的情况下执行"构建",Visual Studio只会报告项目是最新的并且什么都不做 - 后期构建事件不会运行.有什么方法可以强制事件在这种情况下运行?这是必要的,因为尽管DLL本身是最新的,但注册信息可能不是.
我在一个领域工作,其中范围通常包含在内.我有人类可读的描述,例如from A to B,代表包括两个端点的范围 - 例如from 2 to 4手段2, 3, 4.
在Python代码中使用这些范围的最佳方法是什么?以下代码用于生成包含的整数范围,但我还需要执行包含切片操作:
def inclusive_range(start, stop, step):
return range(start, (stop + 1) if step >= 0 else (stop - 1), step)
Run Code Online (Sandbox Code Playgroud)
唯一的完整的解决方案我看到的是明确使用+ 1(或- 1)我每次使用时间range或切片符号(例如range(A, B + 1),l[A:B+1],range(B, A - 1, -1)).这种重复是否真的是与包容性范围一起工作的最佳方式?
编辑:感谢L3viathan的回答.编写inclusive_slice函数来补充inclusive_range当然是一种选择,尽管我可能会写如下:
def inclusive_slice(start, stop, step):
...
return slice(start, (stop + 1) if step >= 0 else (stop …Run Code Online (Sandbox Code Playgroud) Python有序列化pickle和cPickle模块.
cPickle有一个明显的优势pickle:速度.什么,如果有的话,优势并pickle有过cPickle?
在Visual Studio中创建新的C#项目时,生成的AssemblyInfo.cs文件包含指定程序集GUID的属性.属性上方的注释表明它"如果此项目暴露给COM".
我的程序集都没有包含需要对COM可见的类型,因此我已经标记了我的程序集[assembly: ComVisible(false)].那么指定GUID有什么意义吗?
我的感觉是答案是"不" - 那么为什么默认的AssemblyInfo.cs文件包含[assembly: ComVisible(false)]和[assembly: Guid("...")]?
编辑:
总结一下回答:
在它们之间,答案解释了当且仅当正在使用COM互操作时才需要指定GUID.所以,在我的情况下,没有必要使用GUID.
sharptooth进一步解释说,[assembly: ComVisible(false)]并不意味着不使用COM互操作,因为可以覆盖ComVisible各个类型.因此,默认的AssembyInfo.cs包含两者[assembly: ComVisible(false)]和GUID.
我有System.Collections.Generic.Dictionary<A, B> dictA和B是类和一个实例A a(其中dict.ContainsKey(a)是真的).
是否有可能a直接从Dictionary中获取KeyValuePair ?
或者,我需要创建一个新的KeyValuePair: new KeyValuePair<A, B>(a, dict[a])?
我的应用程序包含三个程序集:一个引用几个DLL的EXE.DLL对我的应用程序是私有的 - 它们仅由此可执行文件使用.
这些集会是否应该有一个强有力的名字?
FxCop建议他们应该 - 对于它目前生成的所有程序集:
CA2210:使用强名称密钥对<assembly>进行签名.
但是,这个建议说:
通常,您应该避免强命名应用程序EXE程序集.
和
您可能希望避免使用应用程序专用的强命名组件.
我应该给这些集会一个强有力的名字吗?在这种情况下这样做(或不这样做)有什么好处?
编辑:
看几个具有类似结构的应用程序,似乎没有就此问题达成共识.Paint.NET和Crack.NET的二进制文件没有强名称,而.NET Reflector和Snoop的二进制文件则没有.
有趣的是,使用Expression套件,Microsoft采用了后一种方法:例如,在Expression Blend中,他们选择对Blend.exe和随附的DLL(例如Microsoft.Expression.Blend.dll)进行强名称签名.
似乎我不太可能得到第一个问题的简单答案:"我应该给这些集会一个强有力的名字吗?".但是,我的第二个问题仍然存在:
在这种情况下,强名称签名二进制文件是否有任何好处?或者,不这样做会有什么好处吗?
编辑2:
如果无论如何都没有压倒性的理由,我倾向于给我的集会一个强有力的名字.因此,我对是否有人可以扩展(从第一个链接)感兴趣:
"强命名可能会使管理依赖项变得更加困难,并为私有组件增加不必要的开销."
是否有算法可以找到无向图的生成树,从而最大限度地减少连接到多个边的顶点数?
例如,给定一个4 x 4网格图,我们希望在左边找到一个生成树(它有7个顶点连接到多个边)而不是右边的生成树(有12个):
编辑:如果我们只考虑平面图(甚至只是网格图),这个问题会更简单吗?
.net ×3
algorithm ×2
c# ×2
python ×2
assemblies ×1
assembly ×1
c ×1
c++ ×1
collections ×1
com ×1
comvisible ×1
dictionary ×1
generics ×1
grammar ×1
graph-theory ×1
guid ×1
ll-grammar ×1
modulo ×1
parsing ×1
pickle ×1
range ×1
regsvr32 ×1
slice ×1
strongname ×1
tree ×1
x86 ×1