上下文敏感的代码标记化

时间:2015-08-21 15:47:40

标签: parsing token tokenize formal-languages

我正在使用

语言的解析器
  • 标识符(例如,一个字母后跟一些字母数字字符或下划线),

  • 整数(任意位数和可能的插入符^),

  • 一些运营商,

  • filename(一些字母数字字符,可能还有斜线和点)

显然文件名重叠了整数和标识符,所以一般情况下我无法确定我是否有文件名,或者说是标识符,除非文件名包含斜杠或点。

但文件名只能跟随特定的操作符。

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

如果filename是整数和标识符的超集,那么我可能会有语法产生来处理它,但令牌重叠......

1 个答案:

答案 0 :(得分:2)

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

在你的例子中,当你的词法分析器在文件名之前遇到操作符时,它应该切换到FilenameMode状态(或其他),然后在它产生了它期望的文件名令牌后切换回来。

编辑:

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

当您遇到操作员时,您会触发FILENAME_MODE ...

{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }

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

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

...切换回动作中的INITIAL状态。