我想用Roslyn API生成语法节点,而不需要预先存在的语法节点.也就是说,我不能简单地在现有对象上使用WithXYZ()方法来修改它,因为没有现有对象.
例如,我想生成一个InvocationExpressionSyntax对象.假设有一个构造函数,我可以做类似的事情
var invoke = new InvocationExpressionSyntax(expression, arguments);
Run Code Online (Sandbox Code Playgroud)
但构造函数InvocationExpressionSyntax似乎不公开.
http://www.philjhale.com/2012/10/getting-started-with-roslyn.html
这个博客建议我可以使用像这样的API
Syntax.InvocationExpression()
Run Code Online (Sandbox Code Playgroud)
但是我没有看到Syntax引用的内容,我在Roslyn API中看不到任何与它类似的内容.
我确实找到了允许我这样做的Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory
var invoke = SyntaxFactory.InvocationExpression().WithExpression(expression);
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好.也Microsoft.CodeAnalysis.CSharp.SyntaxFactory有人想知道.
是SyntaxFactory创建新语法节点的正确方法吗?
我找到SyntaxFactory.InvocationExpression的方法是查看src/Compilers/VisualBasic/Portable目录下的roslyn源代码(https://github.com/dotnet/roslyn)中的PublicAPI.txt文件.否则,我看不到记录在哪里SyntaxFactory.
在给定的调用站点给定一组重载的情况下,Swift 2.1编译器如何确定调用哪个方法或运算符?
这个问题可能会混淆两个问题:方法重载和运算符重载,但至少表面上看它们是相关的.不知何故,他们最终会使用不同的规则,我将很快演示.
class A{
}
class B: A {
}
func +(a:A, b:A){
print("+1")
}
func +(a:A, b:B){
print("+2")
}
func +(a:B, b:A){
print("+3")
}
/*
func +(a:B, b:B){
print("+4")
}
*/
A() + A() // prints +1
A() + B() // prints +1
B() + A() // prints +1
// B() + B() // will come back to this
func f(a: A, b: A){
print("f1")
}
func f(a: B, b: A){
print("f2")
}
func f(a: A, b: B){ …Run Code Online (Sandbox Code Playgroud) 精简版:
我在用
parser.addErrorListener(new DiagnosticErrorListener());
parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的解析器时,我没有看到任何输出到'reportAmbiguity ...'的影响,正如ANTLR4书中所示.我怎么能在语法中看到歧义?
长版:
在8核2.67ghz Xeon E5640机器上,我目前使用ANTLR4获得的解析速度约为90kb/s.lexing速度约为5mb/s,所以很好.在尝试优化我的解析器时,我发现了两个阶段解析,其中第一个阶段使用PredictionMode.SLL进行解析,如果失败,则第二个阶段使用PredictionMode.LL.使用这两种模式是有效的,我看到一些输入使用SLL成功的时间比LL使用的时间短.
问题是我希望所有(或大多数)成功使用SLL.我假设我需要从语法中消除歧义来实现这一目标.我想ANTLR4告诉我任何含糊之处,以便我可以解决它们.
gcc或clang的标志会改善编译时间吗?我需要启用调试,但如果它们将导致更快的编译,则可以免费禁用任何其他功能.
我知道还有很多其他方法可以改善编译时间,但我对此领域感兴趣.
我正在创建一个应该在Linux上运行的图形安装程序.安装应包括将文件复制到某些地方/usr.目前,安装程序是用Python编写的.
当我需要复制文件时,如何升级安装程序的权限?我查看了PolicyKit但是
我也看了PAM,我有使用libpam的代码,但我似乎无法用它做任何事情.在验证我的用户(通过提供用户名和密码)后,我没有写入权限/usr.我尝试os.setuid(0)在验证后更改我的用户,但是我从操作系统收到错误.
另外,奇怪的是,我提供的服务似乎并不重要pam_start.只要用户名和密码正确,我就可以传递任何我想要的东西.我看到了/etc/pam.d/sudo.下面的代码被简化,密码正确存储在一个pam_conversation对象中,我传递一个句柄对象.
pam_start("my_user", "my_pass", "sudo_garbage_12345");
Run Code Online (Sandbox Code Playgroud)
同样有效
pam_start("my_user", "my_pass", "sudo");
Run Code Online (Sandbox Code Playgroud)
也就是说,他们都成功了.
作为最后的手段,我可以执行gksudo,kdesudo但我不想与这些程序绑定.要求用户调用我的安装程序sudo是一个(非常)最后的手段.
C#提供了多种执行异步执行的方法,如线程,期货和异步.
在什么情况下异步是最佳选择?
我已经阅读了很多关于async 如何和什么的文章,但到目前为止我还没有看到任何讨论其原因的文章.
最初我认为async是一种创建未来的内置机制.就像是
async int foo(){ return ..complex operation..; }
var x = await foo();
do_something_else();
bar(x);
Run Code Online (Sandbox Code Playgroud)
对'await foo'的调用将立即返回,并且使用'x'将等待'foo'的返回值.async不会这样做.如果您想要这种行为,您可以使用期货库:https://msdn.microsoft.com/en-us/library/Ff963556.aspx
上面的例子就像是
int foo(){ return ..complex operation..; }
var x = Task.Factory.StartNew<int>(() => foo());
do_something_else();
bar(x.Result);
Run Code Online (Sandbox Code Playgroud)
这并不像我希望的那样漂亮,但它仍然有效.
因此,如果您有一个问题,您希望让多个线程对作品进行操作,那么请使用future或其中一个并行操作,例如Parallel.For.
因此,async/await可能不适用于并行执行工作以增加吞吐量的用例.
c# ×2
.net ×1
antlr4 ×1
async-await ×1
asynchronous ×1
c++ ×1
installer ×1
java ×1
linux ×1
pam ×1
parsing ×1
privileges ×1
roslyn ×1
swift ×1
vb.net ×1