我想获得一个用于C++的AST,然后我可以使用外部程序进行解析.哪些程序适合为C++生成AST?我不关心它实现的语言或输出格式(只要它易于解析).
我的总体目标是将C++单元测试台转换为相应的C#包装器测试台.
假设我有
void foo () {
Bar bar = new Bar(); // bar is never referred to after this line
// (1)
doSomethingWithoutBar();
}
Run Code Online (Sandbox Code Playgroud)
在(1),对象bar是否指向有资格进行垃圾收集?或者也bar必须超出范围?如果GC.Collect被调用它会有所作为doSomethingWithoutBar吗?
这与知道Bar是否有(C#)析构函数或类似的类似内容有关.
我正在Haskell写一个Magic The Gathering(MTG)游戏引擎.
对于那些不熟悉MTG的人来说,它是一种纸牌游戏,其中卡片最多可以有5种颜色:白色(W),蓝色(U),黑色(B),红色(R)和绿色(G).
{-# LANGUAGE ViewPatterns #-}
import Data.Set
data Color = W | U | B | R | G
deriving (Show, Eq, Ord)
data Card = Card (Set Color) -- simplified Card type with only its colors
viewColors :: Card -> [Color]
viewColors (Card colors) = toList colors
Run Code Online (Sandbox Code Playgroud)
我想做的是像这样的颜色模式匹配:
foo :: Card -> String
foo (viewColors -> [W, B]) = "card is white and black"
foo _ = "whatever"
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但这里有一个问题:我可以在视图模式中错误地键入颜色顺序,如下所示:
bar :: Card -> String
bar (viewColors …Run Code Online (Sandbox Code Playgroud) 我遇到过执行以下转换的代码:
static_cast<unsigned long>(-1)
据我所知,C++标准定义了将有符号整数值转换为无符号整数类型时会发生什么(请参阅:如果我将一个负值分配给无符号变量,会发生什么?).
我在上面的代码中所关心的是源和目标类型可能是不同的大小,以及这是否会对结果产生影响.编译器会在转换之前扩大源值类型吗?它会转换为相同大小的无符号整数然后放大吗?或许还有其他什么?
用代码澄清,
int nInt = -1;
long nLong = -1; // assume sizeof(long) > sizeof(int)
unsigned long res1 = static_cast<unsigned long>(nInt)
unsigned long res2 = static_cast<unsigned long>(nLong);
assert(res1 == res2); // ???
Run Code Online (Sandbox Code Playgroud)
基本上,我应该担心像编写代码一样
static_cast<unsigned long>(-1L)
Run Code Online (Sandbox Code Playgroud)
过度
static_cast<unsigned long>(-1)
Run Code Online (Sandbox Code Playgroud) (感谢下面的greg0ire帮助了解关键概念)
挑战:构建一个程序,找到所有子串并用颜色属性"标记"它们(用XML有效地突出显示它们).
规则:
<TAG#>theSubstring</TAG#>,其中#是该子字符串和相同子字符串唯一的正数.注意:以下示例中显示的标记顺序并不重要.OP仅用于清晰度.
输入示例:
LoremIpsumissimplydummytextoftheprintingandtypesettingindustry.LoremIpsumhasbeentheindustry'sstandarddummytexteversincethe1500s,whenanunknownprintertookagalleyoftypeandscrambledittomakeatypespecimenbook.
Run Code Online (Sandbox Code Playgroud)
部分正确的输出(OP在这个例子中可能没有完全完全替换)
<TAG1>LoremIpsum</TAG1>issimply<TAG2>dummytext</TAG2>of<TAG5>the</TAG5><TAG3>print</TAG3>ingand<TAG4>type</TAG4>setting<TAG6>industry</TAG6>.<TAG1>LoremIpsum</TAG1>hasbeen<TAG5>the</TAG5><TAG6>industry</TAG6>'sstandard<TAG2>dummytext</TAG2>eversince<TAG5>the</TAG5>1500s,whenanunknown<TAG3>print</TAG3>ertookagalleyof<TAG4>type</TAG4>andscrambledittomakea<TAG4>type</TAG4>specimenbook.
Run Code Online (Sandbox Code Playgroud)
您的代码应该能够处理边缘情况,例如:
示例输入2:
hello!TAG!</hello.TAG.</
Run Code Online (Sandbox Code Playgroud)
示例输出2:
<TAG1>hello</TAG1>!<TAG2>TAG</TAG2>!<TAG3></</TAG3><TAG1>hello</TAG1>.<TAG2>TAG</TAG2>.<TAG3></</TAG3>
Run Code Online (Sandbox Code Playgroud)
获胜者,冠军:
轻微澄清:
假设我有一个不从任何东西继承的类A,没有虚方法,并且只有一个类型为T的变量.C++是否保证sizeof(A) == sizeof(T)?
编辑:
如果T是复合类型,它会有所作为吗?
参考计数究竟是什么?特别是,C++的用途是什么?如果我们不处理它们会遇到什么问题?所有语言都需要引用计数吗?
Greasemonkey可以删除给定域中的cookie吗?如果是这样,怎么样?
作为一名长期的Java程序员,近年来Haskell成瘾者,我现在正在学习Scala.我的问题是:
如何编写没有Java副作用的程序?
即我如何手动完成Scala为我做的事情?
来自Odersky的Scala书经常用OO术语解释功能概念(例如val = final,if = ternary op.).
是否有一个可访问的指南如何编写没有Java的副作用(尽可能少)?我想可以通过普通的旧java和一些规则来获得许多已知的好处(例如,不可修改的集合,最终值,不修改对象/应用程序状态的刚性方法).
在C++ 11中,我们得到constexpr:
constexpr int foo (int x) {
return x + 1;
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用编译时错误foo的动态值进行调用x?也就是说,我想创建一个foo只能传递constexpr参数的东西.
c++ ×5
c# ×1
c++11 ×1
casting ×1
class ×1
code-golf ×1
constexpr ×1
constructor ×1
cookies ×1
firefox ×1
greasemonkey ×1
haskell ×1
java ×1
javascript ×1
scala ×1
size ×1
sizeof ×1
string ×1
userscripts ×1