这可能不是表达它的最佳方式,但我正在考虑编写一个工具,将我的代码中用空格分隔的标识符转换为驼峰大小写。一个简单的例子:
var zoo animals = GetZooAnimals(); // i can't help but type this
var zooAnimals = GetZooAnimals(); // i want it to rewrite it like this
我想知道编写这样的工具是否会遇到任何歧义,假设它忽略了所有关键字。我能想到的唯一原因是,如果有一个语法上有效的表达式,其中2个标识符只用空格分隔。
纵观grammar我无法立即找到允许它的地方,但也许其他人会更清楚。
另一方面,我意识到这不是许多人所遇到的真正问题的实际解决方案,而是我一直在做的事情,并且想要用工具来固定而不是强迫自己总是写骆驼案。
答案 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;
是一对空格分隔的标识符,完全有效。如果你想要同时包含类型名称和变量名称,这将导致歧义。