在编译器构造中,使用令牌或字符串之间是否有区别?

问题描述 投票:0回答:2

[我试图在JavaCC中优化编译器,但是遇到了过去在使用编译器时从未发现过的东西,因为我被教导要在任何终端上使用令牌。

此编译器有时在语法分析的正则表达式中使用字符串而不是标记,例如:

<TK_IF> "(" log_expr ")" body

而不是:

<TK_IF> <TK_LPAREN> log_expr <TK_RPAREN> body

这仅是一个示例,在代码的其他部分中,在(+,-,!=,==,>,

我想知道的是,在编译器中使用标记或字符串之间是否存在某些区别,主要是关于性能,这是我对其进行优化的目标。

compiler-construction compiler-optimization lexical-analysis javacc
2个回答
2
投票

过去,实现词法分析器/令牌生成器,使它们为每个令牌类型编号返回“小整数”值,这是很普遍的。

IF the next token is the word "def" THEN RETURN 257 FI

例如。结合使用7位或8位字符集,我们立即看到所有256个可能的字符值都可以用作标记值。因此,“ (”只能是令牌号40(请参见任何ASCII表)。

[您经常可以判断某人是否在使用这种表示法,因为像+这样的单字符运算符将以这种方式编码(+ = 43),但是像+=这样的两个字符运算符将具有命名标记。当生成令牌查找代码的代码生成令牌表,并且第一个named令牌的数字值刚好大于255(最大8位值)时,就会发生另一种赠与。

最后,这并不是很重要:这只是一个实现上的怪癖。如果您编写自己的扫描器和解析器,则将做任何适当的操作以将适当的令牌代码返回到解析器。您如何将某些输入语法转换为适当的code

取决于您。

0
投票

答案在the FAQ中。

© www.soinside.com 2019 - 2024. All rights reserved.