代码的上下文敏感标记化

context sensitive tokenization of code

我正在为一种语言开发解析器

显然文件名与整数和标识符重叠,所以通常我无法确定我是否有文件名或标识符,除非文件名包含斜杠或点。

但是文件名只能跟在特定的运算符后面。

我的问题是在标记化过程中通常如何处理这种情况?我有一个 table 驱动的分词器(词法分析器),但我不确定如何从整数或标识符中区分文件名。这是怎么做到的?

如果文件名是整数和标识符的超集,那么我可能会有可以处理它的语法产生式,但是标记重叠...

Flex 和其他词法分析器有start conditions 的概念。本质上,词法分析器是一个状态机,它的确切行为将取决于它的当前状态。

在您的示例中,当您的词法分析器遇到文件名前面的运算符时,它应该切换到 FilenameMode 状态(或其他状态),然后在生成它期望的文件名标记后切换回来。

编辑:

只是为了在超链接这一边给出一些具体代码:

当你遇到操作员时你会触发你的FILENAME_MODE...

{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }

您将定义解析文件名的规则:

<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }

...在动作中切换回INITIAL状态