小编jon*_*onr的帖子

如何从头开始在Roslyn中创建语法节点?

我想用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.

c# vb.net roslyn

11
推荐指数
2
解决办法
2801
查看次数

对于函数和运算符,Swift中的重载决策有哪些规则?

在给定的调用站点给定一组重载的情况下,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)

swift

7
推荐指数
0
解决办法
153
查看次数

如何诊断ANTLR4语法中的歧义?

精简版:

我在用

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告诉我任何含糊之处,以便我可以解决它们.

java parsing antlr4

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

什么标志会改善gcc/clang编译时间?

gcc或clang的标志会改善编译时间吗?我需要启用调试,但如果它们将导致更快的编译,则可以免费禁用任何其他功能.

我知道还有很多其他方法可以改善编译时间,但我对此领域感兴趣.

c++ compiler-construction

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

以编程方式升级linux上的权限

我正在创建一个应该在Linux上运行的图形安装程序.安装应包括将文件复制到某些地方/usr.目前,安装程序是用Python编写的.

当我需要复制文件时,如何升级安装程序的权限?我查看了PolicyKit但是

  • a)PolicyKit似乎没有通用的"安装文件"action-id
  • b)我可以使用的动作ID,我不认为它们是发行版的标准

我也看了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是一个(非常)最后的手段.

linux installer privileges pam

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

async/await的用例是什么?

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可能不适用于并行执行工作以增加吞吐量的用例.

.net c# multithreading asynchronous async-await

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