2016-12-04 57 views
0

我已经开始编写自己的词法分析器,并且由于它们具有与它们相关联的开始(“)和结束(”)字符而导致令牌化字符串出现问题。Lexer:在标记时处理未终止的字符串

有没有人知道一个常见的技术,一个词法分析器可以应付并继续lexing与一个未终止的字符串? 我认为ANTLR可以做到这一点,这是由ANTLR的ATN处理?

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

  1. 字符串终止发生在一个单独的行 - 因此警告说,串只能在一个单一的放在用户线。
  2. 字符串终止不会发生,那么您什么时候知道要继续的有效点是?在新行后使用下一个有效标记的启发式。

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

回答

1

如果你的语言禁止换行符字符串常量,那么就终止在该行的结束的字符串是容易被接受的。在字符串文字的同一行上会出现声明或关键字声明是不太可能的(并且没有理由通过尝试补偿它来鼓励不良风格)。

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

printf("%s\n, line); 

但是你可能有恢复规则,可以解决这个问题。

如果字符串文字可以包含换行符 - 并且有足够的证据表明这个特性通常是需要的 - 那么恢复就相当困难了,您可能会发现最简单的解决方案就是抛出语法错误明确指出违规字符串的起始位置。

+0

我在另一个答案的地方读到,错误处理要比解析器而不是词法分析器好得多。你对此有何看法,以及如何通过它,因为这里没有标记...... – Har

+1

@har:肯定有一个集中处理错误的说法,但是词法错误总是会在扫描器中被检测到。我通常只是调用'yyerror'来报告错误;在不好的情况下(同样适用于不好的数字),通常没有其他需要做的事情。当然,你可以返回一个“不好的字面量”标记,然后在解析器中产生一个错误信息,并生成一个单元,将'BAD_LITERAL'变成一个'value'(或者任何非终端的base)错误。 – rici