关于 C 中的词法错误的说明
Clarification regarding lexical errors in C
我已经阅读了 this and this 个问题。它们很有帮助,但我仍然对 C 的词法分析器中的令牌生成有一些疑问。
如果词法分析器检测到 int a2.5c;
那么根据我的理解将生成 7 个标记。
int keyword
a identifier
2 constant
. special symbol
5 constant
c identifier
; special symbol
所以词法分析器不会报错,token会生成成功。
我的理解对吗?如果不是那么你能帮我理解吗?
此外,如果我们将任何常量声明为 double a = 10.10.10;
它会产生任何词汇错误吗?为什么?
更新:出于好奇,如果词法分析器在程序中检测到 :-)
笑脸之类的东西怎么办?它会产生任何词汇错误吗?因为根据我的理解 :
将被视为特殊符号,-
将被视为运算符并且 )
将再次被视为特殊符号
谢谢
您的第一个标记列表几乎是正确的 -- a2
是一个有效的标识符。
第一个示例确实不会生成任何 "lexical" 错误 本身 ,尽管 .
处会出现解析错误。
很难说你第二个例子中的错误是词法错误还是解析错误。浮点常量的词法结构非常复杂。我可以想象一个编译器获取一串数字和 .
和 e
/E
并且直到它调用 strtod
的等价物时才注意到有两位小数点,这意味着它可能会报告 "lexical error"。不过,严格来说,我们有两个连续的浮点常量 -- 10.10
和 .10
,这意味着它更可能是 "parse error".
不过,归根结底,这些都只是错误。除非你使用编译器 design/construction class,否则我不确定将错误 [=53=] 确定为词法错误或其他错误有多重要。
解决您的后续问题,是的,:-)
将 lex 视为三个标记 :
、-
和 )
。
因为几乎所有的标点字符在 C 中都是合法的,所以在词法上非法的字符序列相对较少(也就是说,在词法分析阶段会产生错误)。其实我能想到的只有:
- 非法字符(我认为唯一未使用的是`和@)
- 字符和字符串常量的各种问题(缺少
'
或 "
、错误的转义序列等)
事实上,几乎任何您想要发出的标点符号字符串都可以通过 C 词法分析器,尽管它当然可能会或可能不会被解析。 (一个有点臭名昭著的例子是 a+++++b
,不幸的是,它的词法是 a++ ++ + b
,因此是一个语法错误。)
我写的 C 词法分析器将其标记为
keyid int
white " "
keyid a2
const .5
keyid c
punct ;
white "\n"
其中keyid为关键字或标识符; const 是数字常量,punct 是标点符号(white 是 white space)。
我不会说有词汇错误;但肯定是由于标识符后跟数字常量而必须诊断的语法错误,没有任何语法规则可以减少这种错误。
我已经阅读了 this and this 个问题。它们很有帮助,但我仍然对 C 的词法分析器中的令牌生成有一些疑问。
如果词法分析器检测到 int a2.5c;
那么根据我的理解将生成 7 个标记。
int keyword
a identifier
2 constant
. special symbol
5 constant
c identifier
; special symbol
所以词法分析器不会报错,token会生成成功。
我的理解对吗?如果不是那么你能帮我理解吗?
此外,如果我们将任何常量声明为 double a = 10.10.10;
它会产生任何词汇错误吗?为什么?
更新:出于好奇,如果词法分析器在程序中检测到 :-)
笑脸之类的东西怎么办?它会产生任何词汇错误吗?因为根据我的理解 :
将被视为特殊符号,-
将被视为运算符并且 )
将再次被视为特殊符号
谢谢
您的第一个标记列表几乎是正确的 -- a2
是一个有效的标识符。
第一个示例确实不会生成任何 "lexical" 错误 本身 ,尽管 .
处会出现解析错误。
很难说你第二个例子中的错误是词法错误还是解析错误。浮点常量的词法结构非常复杂。我可以想象一个编译器获取一串数字和 .
和 e
/E
并且直到它调用 strtod
的等价物时才注意到有两位小数点,这意味着它可能会报告 "lexical error"。不过,严格来说,我们有两个连续的浮点常量 -- 10.10
和 .10
,这意味着它更可能是 "parse error".
不过,归根结底,这些都只是错误。除非你使用编译器 design/construction class,否则我不确定将错误 [=53=] 确定为词法错误或其他错误有多重要。
解决您的后续问题,是的,:-)
将 lex 视为三个标记 :
、-
和 )
。
因为几乎所有的标点字符在 C 中都是合法的,所以在词法上非法的字符序列相对较少(也就是说,在词法分析阶段会产生错误)。其实我能想到的只有:
- 非法字符(我认为唯一未使用的是`和@)
- 字符和字符串常量的各种问题(缺少
'
或"
、错误的转义序列等)
事实上,几乎任何您想要发出的标点符号字符串都可以通过 C 词法分析器,尽管它当然可能会或可能不会被解析。 (一个有点臭名昭著的例子是 a+++++b
,不幸的是,它的词法是 a++ ++ + b
,因此是一个语法错误。)
我写的 C 词法分析器将其标记为
keyid int
white " "
keyid a2
const .5
keyid c
punct ;
white "\n"
其中keyid为关键字或标识符; const 是数字常量,punct 是标点符号(white 是 white space)。 我不会说有词汇错误;但肯定是由于标识符后跟数字常量而必须诊断的语法错误,没有任何语法规则可以减少这种错误。