我正在构建一个编译器并且有一个疑问。在STRING的情况下,我们对长度一无所知,但在CHARACTER的情况下,我们知道它将是3或4个符号,包括起始和结束单引号(例如'a','/ t')。那么,如果输入字符串的长度超过4个符号,或者这是Parser的工作,我们是否可以利用这些知识并在Lexer中标记错误?
实施例。 “AAAAAAAAAAA”
这是字符或语法错误的词法错误吗?什么可能是这次检查的最佳位置?
答案 0 :(得分:2)
在C中,‘aaaaaaaaaaa’
既不是词法也不是语法错误,尽管它的语义是实现定义的:
包含多个字符的整数字符常量的值(例如, ' ab'),或包含不映射到单字节的字符或转义序列 执行字符,是实现定义的。 (C标准,第6.4.4.4节,第10段。)
将字符常量限制为单个字符或转义序列会很容易,但不能通过计算字符常量的显示长度来实现。 (例如,'ab'
(长度4)是非法的,而'\x2C'
(长度5)是合法的,'\u00C3'
(长度6)取决于编码。)
无论如何," lexical"之间的边界。和"句法"错误定义不是特别明确,特别是对于C,其中23skidoo
是有效的预处理程序令牌但不是有效令牌。
如果您的问题是"我是否应该在扫描仪或解析器中检测到并对此错误作出反应,我会回答,"对您来说最方便的是#34;。我倾向于将所有错误处理集中在一个地方,这意味着在解析器中,这需要扫描程序传递一个特殊的错误令牌"令牌到解析器,以便在解析器中触发错误检测(并可能恢复)。