是否有一个语法上合法的表达式,它有2个连续的标识符,只用C#中的空格分隔?

时间:2015-03-16 02:13:25

标签: c# syntax

这可能不是表达它的最佳方式,但我正在考虑编写一个工具,将我的代码中用空格分隔的标识符转换为驼峰大小写。一个简单的例子:

var zoo animals = GetZooAnimals(); // i can't help but type this
var zooAnimals = GetZooAnimals(); // i want it to rewrite it like this

我想知道编写这样的工具是否会遇到任何歧义,假设它忽略了所有关键字。我能想到的唯一原因是,如果有一个语法上有效的表达式,其中2个标识符只用空格分隔。

纵观grammar我无法立即找到允许它的地方,但也许其他人会更清楚。

另一方面,我意识到这不是许多人所遇到的真正问题的实际解决方案,而是我一直在做的事情,并且想要用工具来固定而不是强迫自己总是写骆驼案。

2 个答案:

答案 0 :(得分:2)

如果进入:

csharp> var i j = 3;
(1,7): error CS1525: Unexpected symbol `j', expecting `,', `;', or `='

csharp交互式shell中,一个获取解析器生成的错误(一个(LA)LR解析器执行簿记,接下来会发生什么)。这样的解析器从左到右工作,所以它不知道下一个字符。它只知道下面的字符是上面显示的列表之一。

这意味着可能没有办法 - 至少声明一个变量 - 用空格。

此外,基于this context-free grammar的C#,似乎并不存在可以将两个标识符放在一起的情况。例如,主表达式可能是一个标识符,但不存在主表达式放在标识符旁边的情况(或者介于其间的可选部分。)

正如@dasblinkenlight所说,你确实可以看到规则"local-variable-declaration"

type variable-declarator
带有type

,可以使用标识符来评估标识符和变量声明符。但是,您可以知道该类型是第一个标识符(或var关键字)。因此,某种重写规则是:

(\w+)(\s+\w+)+ -> \1 concat(\2)

您需要合并(concat)第二组的标识符。如果是作业。

答案 1 :(得分:2)

如果不进行完整的语义分析,很难判断空格分隔的标识符序列是否代表单个变量。例如

Myclass myVariable;

是一对空格分隔的标识符,完全有效。如果你想要同时包含类型名称和变量名称,这将导致歧义。