c# - 为什么以及如何 `a+++b` 被解释为 `(a++) + b` 而不是 `a + (++b)` ?

标签 c# algorithm language-agnostic tokenize

编译器的词法分析器/分词器如何“有意义”:a+++b ?如:

int a=0,b=0,x=0;
x = a+++b;

我认为它使用了一些 suffix tree ,也许是 generalized suffix tree ,但如果是这样,那么为什么较长的标记( ++ )在较短的标记( + )之前被解释,而不是反之亦然?意思是为什么它被解释为:

(a++) + b

而不是:

a + (++b)

我需要自己编写某种标记生成器,并且对此感到好奇。

最佳答案

语言设计者知道这样的歧义,并在引用手册中禁止“错误的情况”。

对于词法分析器来说,这非常简单:选择最长的合法词位。当遇到“++”和“+”时,选择“++”。大多数词法分析器生成器直接实现此策略,并且在手动编码的词法分析器中执行此操作并不难,因为在看到第一个“+”之后,无论如何您都必须检查第二个“+”的可能性。

关于c# - 为什么以及如何 `a+++b` 被解释为 `(a++) + b` 而不是 `a + (++b)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19121048/

相关文章:

c# - 依赖属性重入(或 : why does this work? )

c# - PRISM + MEF -- 如何指定使用哪个导出?

python - 我如何矢量化并加速这个大型数组计算?

algorithm - 使用 Kullback 散度的字符散度

合并两个列表之间缺乏比较的算法

networking - 我想使用 P2P 构建一个去中心化的、类似 reddit 的系统。我应该基于什么现有的 p2p 库?

c# - 为什么 GetHashCode 在 Object 类中?

c# - FluentAssertions Should().BeEquivalentTo() 失败,列表包含从相同接口(interface)派生的运行时指定类型

c# - 按 block 而不是逐行读取一个非常大的文件

java - 问题插入heapsort