关于C中词汇错误的澄清

时间:2015-07-12 15:37:23

标签: c token lexical-analysis lexical

我已阅读thisthis个问题。它们非常有用,但我对C语法分析器中的令牌生成仍有疑问。 如果词法分析器检测到int a2.5c;然后根据我的理解7将会生成令牌。

int keyword
a identifier
2 constant
. special symbol
5 constant
c identifier
; special symbol

因此,词法分析器不会报告任何错误,并且会成功生成令牌。

我的理解是否正确?如果没有,那么请你帮我理解一下吗?

此外,如果我们将任何常量声明为double a = 10.10.10;
它会产生任何词汇错误吗?为什么?

更新:出于好奇,如果词法分析器在程序中检测到:-)笑脸类型怎么办?它会产生任何词汇错误吗?因为根据我的理解:将被视为特殊符号,-将被视为操作符,)将被视为特殊符号
谢谢

2 个答案:

答案 0 :(得分:2)

您的第一个令牌列表几乎是正确的 - a2是有效的标识符。

确实,第一个例子不会产生任何" lexical"错误本身,虽然.会出现解析错误。

很难说第二个示例中的错误是词法错误还是解析错误。浮点常量的词法结构非常复杂。我可以想象一个编译器抓取一串数字.e / E并且没有注意到,直到它调用等价的strtod为止两个小数点,这意味着它可能会报告一个"词汇错误"。严格来说,我们所拥有的是一行中的两个浮点常量 - 10.10.10,这意味着它更可能是一个"解析错误&#34 ;

最后,这些都只是错误。除非您参加编译器设计/构建课程,否则我不确定将错误归类为词汇或其他方面的重要性。

在处理您的后续问题时,是的,:-)会将其作为三个令牌:-)

因为几乎任何标点符号在C中都是合法的,所以在词汇上非法的字符序列相对较少(即,在词法分析阶段会产生错误)。事实上,我唯一能想到的是:

  • 非法角色(我认为唯一未使用的角色是`和@)
  • 字符和字符串常量的各种问题(缺少'",错误的转义序列等。)

事实上,几乎任何你想要敲击的标点符号都会通过C词法分析器,但它当然可能会或可能不会解析。 (一个有点臭名昭着的例子是a+++++b,遗憾的是它是a++ ++ + b,因此是语法错误。)

答案 1 :(得分:0)

我写的C词法分析器将其标记为

keyid int
white " "
keyid a2
const .5
keyid c
punct ;
white "\n"

其中keyid是关键字或标识符; const是数值常数,punct是punctuator(白色是空白)。 我不会说有词汇错误;但肯定是一个语法错误,必须通过标识后跟一个数字常量来诊断,没有语法规则可以减少。