编译器的词法分析器/分词器如何“有意义”: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/