代码的上下文相关令牌化

ako*_*nsu 5 parsing token tokenize formal-languages

我正在为一种具有以下功能的语言进行解析器

  • 标识符(例如,字母后跟多个字母数字字符或下划线),

  • 整数(任意数量的数字和可能的脱字符号^),

  • 一些操作员

  • 文件名(一些字母数字字符,可能还有斜杠和点)

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

但是文件名只能跟随特定的运算符。

我的问题是令牌化期间通常如何处理这种情况?我有一个表驱动的令牌生成器(词法分析器),但是我不确定如何从整数或标识符中分辨出文件名。怎么做?

如果filename是整数和标识符的超集,那么我可能可以使用可以处理该语法的语法,但是标记重叠...

geo*_*f_h 3

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

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

编辑:

只是为了在超链接的这一侧提供一些具体代码:

FILENAME_MODE当你遇到接线员时你就会触发你...

{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); }
Run Code Online (Sandbox Code Playgroud)

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

<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); }
Run Code Online (Sandbox Code Playgroud)

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