词法分析器:在标记化的同时处理未终止的字符串

Lexer: Handling unterminated strings whilst tokenizing

我已经开始编写自己的词法分析器,但由于字符串具有与之相关联的开始 (") 和结束 (") 字符,所以在标记字符串时遇到了问题。

有谁知道词法分析器可以处理并继续对未终止字符串进行词法分析的常用技术? 我认为 ANTLR 可以做到这一点,这是由 ANTLR 中的 ATN 处理的吗?

假设字符串必须在一行终止,我可以看到这里有两个问题:

  1. 字符串终止发生在单独的一行上——因此警告用户字符串只能放在一行上。
  2. 没有发生字符串终止,那么您知道什么时候可以继续有效?在新行之后使用下一个有效标记的启发式。

char *mystring = "my string which is unterminated....
int id = 20;

如果您的语言禁止在字符串文字中换行,那么仅在行尾终止字符串可能是可以接受的。与字符串文字在同一行上的声明或关键字语句不太可能(并且没有理由通过尝试补偿它来鼓励不良风格。)

您可能会跳过有用的右括号:

 printf("%s\n, line);

但您可能已经制定了可以应对这种情况的恢复规则。

如果字符串文字可以包含换行符——并且有充分的证据表明通常需要此功能——那么恢复就会更加困难,你可能会发现最简单的解决方案就是抛出一个语法错误其中清楚地说明了违规字符串的起始位置。