字符长度属性是词法分析器还是解析器的一部分?

时间:2014-12-26 21:16:28

标签: parsing compiler-construction lexer

我正在构建一个编译器并且有一个疑问。在STRING的情况下,我们对长度一无所知,但在CHARACTER的情况下,我们知道它将是3或4个符号,包括起始和结束单引号(例如'a','/ t')。那么,如果输入字符串的长度超过4个符号,或者这是Parser的工作,我们是否可以利用这些知识并在Lexer中标记错误?

实施例。 “AAAAAAAAAAA”

这是字符或语法错误的词法错误吗?什么可能是这次检查的最佳位置?

1 个答案:

答案 0 :(得分:2)

在C中,‘aaaaaaaaaaa’既不是词法也不是语法错误,尽管它的语义是实现定义的:

  

包含多个字符的整数字符常量的值(例如,   ' ab'),或包含不映射到单字节的字符或转义序列   执行字符,是实现定义的。 (C标准,第6.4.4.4节,第10段。)

将字符常量限制为单个字符或转义序列会很容易,但不能通过计算字符常量的显示长度来实现。 (例如,'ab'(长度4)是非法的,而'\x2C'(长度5)是合法的,'\u00C3'(长度6)取决于编码。)

无论如何," lexical"之间的边界。和"句法"错误定义不是特别明确,特别是对于C,其中23skidoo是有效的预处理程序令牌但不是有效令牌。

如果您的问题是"我是否应该在扫描仪或解析器中检测到并对此错误作出反应,我会回答,"对您来说最方便的是#34;。我倾向于将所有错误处理集中在一个地方,这意味着在解析器中,这需要扫描程序传递一个特殊的错误令牌"令牌到解析器,以便在解析器中触发错误检测(并可能恢复)。